문제

다음 코드

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, 그러므로 그것을 그렇게 취급하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top