"휘발성 필드에 대한 언급은 휘발성으로 취급되지 않습니다"
-
06-07-2019 - |
문제
다음 코드
using System.Threading;
class Test
{
volatile int counter = 0;
public void Increment()
{
Interlocked.Increment(ref counter);
}
}
다음 컴파일러 경고를 높입니다.
"A reference to a volatile field will not be treated as volatile"
이 경고를 제기하기 위해 여기서 잘못하고 있습니까? 컴파일러가 왜 이것에 대해 경고합니까?
해결책
당신은 잘못한 일을하지 않습니다. 에 따르면 선적 서류 비치:
휘발성 필드는 일반적으로 ref 또는 out 매개 변수를 사용하여 통과해서는 안됩니다. 함수의 범위 내에서 휘발성으로 취급되지 않기 때문입니다. 인터 로크 API를 호출 할 때와 같은 예외가 있습니다.
다른 팁
기본적으로 경고는 휘발성 필드를 참조하여 통과 할 때 호출 코드가 휘발성 방식으로 처리하는 것을 모른다는 것입니다. 방법의 특성으로 인해 중요하지 않은 interlocked.increment의 경우 - 변수가 휘발성이 필요하지 않습니다. 그래도 인터 로크를 사용하는 경우.
일반적으로 두 가지를 혼합하지 않을 것 같아요. 인터 로크를 사용하는 경우 해요. 어디에나 (사용 Interlocked.CompareExchange(ref counter, 0, 0)
읽으려면). 나는 개인적으로 휘발성을 매우 자주 사용한다고 말할 수 없습니다. 간단한 카운터의 경우 i ~할 것 같다 인터 로크를 사용하지만 대부분의 작업에 잠금을 사용할 가능성이 높습니다.
이것을 사용하십시오 :
#pragma warning disable 420
// M
// dM
// MMr
// 4MMML .
// MMMMM. xf
// . "MMMMM .MM-
// Mh.. +MMMMMM .MMMM
// .MMM. .MMMMML. MMMMMh
// )MMMh. MMMMMM MMMMMMM
// 3MMMMx. 'MMMMMMf xnMMMMMM"
// '*MMMMM MMMMMM. nMMMMMMP"
// *MMMMMx "MMMMM\ .MMMMMMM=
// *MMMMMh "MMMMM" JMMMMMMP
// MMMMMM 3MMMM. dMMMMMM .
// MMMMMM "MMMM .MMMMM( .nnMP"
// =.. *MMMMx MMM" dMMMM" .nnMMMMM*
// "MMn... 'MMMMr 'MM MMM" .nMMMMMMM*"
// "4MMMMnn.. *MMM MM MMP" .dMMMMMMM""
// ^MMMMMMMMx. *ML "M .M* .MMMMMM**"
// *PMMMMMMhn. *x > M .MMMM**""
// ""**MMMMhx/.h/ .=*"
// .3P"%....
// nP" "*MMnx
if(Interlocked.CompareExchange(ref isLoaded, 1, 0) != 0)
return;
#pragma warning restore 420
참조로 필드를 통과하기 때문에 오류가 발생합니다. 이것이 의미하는 바는 대상 방법이 필드가 volatile
, 그러므로 그것을 그렇게 취급하지 않을 것입니다.
제휴하지 않습니다 StackOverflow