tag remarks example c# .net multithreading volatile

example - remarks c#



"Una referencia a un campo volátil no será tratada como volátil" implicaciones (4)

Básicamente, la advertencia es que cuando pasa un campo volátil por referencia, el código de llamada no sabe tratarlo de manera volátil. Para enclavamiento. Incremento que probablemente no importe, debido a la naturaleza del método, pero no es necesario que la variable sea volátil de todos modos si está utilizando Enclavamiento.

En general, creo que evitaría mezclar los dos: si está usando Enclavamiento, hágalo en todas partes (usando Interlocked.CompareExchange(ref counter, 0, 0) para leerlo). No puedo decir que utilizo volátiles muy a menudo, personalmente. Para los contadores simples podría usar Enclavamiento, pero es más probable que use un candado para la mayoría de las tareas.

El siguiente código

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

Levanta la siguiente advertencia del compilador:

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

¿Estoy haciendo algo mal aquí para plantear esta advertencia? ¿Por qué el compilador me advierte sobre esto?


No estás haciendo nada malo. De acuerdo con la documentación :

Normalmente, un campo volátil no debería pasarse utilizando un parámetro ref o out, ya que no se tratará como volátil dentro del alcance de la función. Hay excepciones a esto, como cuando se llama a una API entrelazada.


Recibirá el error porque está pasando el campo por referencia. Creo que lo que esto significa es que el método objetivo no tiene idea de que el campo está marcado como volatile y, por lo tanto, no lo tratará como tal.


Utilizar esta:

#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