significa que c# .net multithreading locking volatile

c# - significa - ¿Debe declararse una variable de bloqueo volátil?



que significa volatile en c (2)

Tengo la siguiente declaración de bloqueo:

private readonly object ownerLock_ = new object(); lock (ownerLock_) { }

¿Debo usar la palabra clave volatile para mi variable de bloqueo?

private readonly volatile object ownerLock_ = new object();

En MSDN vi que generalmente se usa para un campo al que se accede sin bloqueo, por lo que si uso Lock, ¿no necesito usar volatile?

Desde volatile :

El modificador volátil se usa generalmente para un campo al que se accede mediante varios subprocesos sin usar la instrucción de bloqueo para serializar el acceso.


Si solo está accediendo a los datos que el bloqueo "guarda" mientras posee el bloqueo, entonces sí, hacer que esos campos sean volátiles es superfluo. Tampoco es necesario que la variable ownerLock_ sea ​​volátil. (Actualmente no ha mostrado ningún código real dentro de la declaración de lock , lo que hace que sea difícil hablar en términos concretos, pero supongo que en realidad estará leyendo / modificando algunos datos dentro de la declaración de lock ).

volatile debe utilizar muy raramente en el código de la aplicación. Si desea tener acceso sin bloqueo a una sola variable, el Interlocked es casi siempre más sencillo de razonar. Si quieres un acceso sin bloqueo más allá de eso, casi siempre empezaré a bloquear. (O intente utilizar estructuras de datos inmutables para comenzar.)

Solo esperaría ver volatile dentro del código que está tratando de construir abstracciones de nivel superior para el subprocesamiento, así que dentro del código base de TPL, por ejemplo. Es realmente una herramienta para expertos que realmente entienden bien el modelo de memoria .NET ... de los cuales hay muy pocos, OMI.


Si algo es de readonly , es seguro para subprocesos, punto. (Bueno, casi. Un experto podría ser capaz de descubrir cómo obtener una NullReferenceException en su declaración de lock , pero no sería fácil). Con readonly una readonly no necesita volatile , Interlocked o bloqueado. Es la palabra clave ideal para subprocesos múltiples, y debería usarla siempre que pueda. Funciona muy bien para un objeto de bloqueo donde no importa su gran desventaja (no se puede cambiar el valor).

Además, si bien la referencia es inmutable, el objeto al que se hace referencia puede no serlo. "new object ()" está aquí, pero si fuera una List u otra cosa mutable, y no segura para subprocesos , querría bloquear la referencia (y todas las demás referencias a ella, si alguna) para mantener el objeto. De cambiar en dos hilos a la vez.