“Uma referência a um campo volátil não será tratado como implicações voláteis”

StackOverflow https://stackoverflow.com/questions/425132

Pergunta

O código a seguir

using System.Threading;

class Test
{
    volatile int counter = 0;
    public void Increment()
    {
        Interlocked.Increment(ref counter);
    }
}

Levanta o seguinte aviso do compilador:

"A reference to a volatile field will not be treated as volatile"

Estou fazendo algo errado aqui para levantar esse aviso? Por que o compilador me avisa sobre isso?

Foi útil?

Solução

Você não está fazendo nada de errado. De acordo com documentação:

Um campo volátil normalmente não deve ser passado usando um parâmetro REF ou OUT, pois não será tratado como volátil dentro do escopo da função. Há exceções a isso, como ao chamar uma API interligada.

Outras dicas

Basicamente, o aviso é que, quando você passa em um campo volátil por referência, o código de chamada não sabe tratá -lo de maneira volátil. Para intertraar -se. de qualquer forma Se você está usando interligado.

Em geral, acho que evitaria misturar os dois - se você estiver usando interligado, faça -o em toda parte (usando Interlocked.CompareExchange(ref counter, 0, 0) para ler). Não posso dizer que uso volátil com muita frequência, pessoalmente. Para contadores simples eu poderia Use interligado, mas tenho mais probabilidade de usar um bloqueio para a maioria das tarefas.

Usa isto:

        #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

Você está recebendo o erro porque está passando pelo campo por referência. Eu acho que o que isso significa é que o método de destino não tem idéia de que o campo está marcado como volatile, e, portanto, não o tratará como tal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top