Pregunta

Por ejemplo, ¿necesito para bloquear un valor bool cuando multihilo?

¿Fue útil?

Solución

No hay tal cosa como un atómica type . Sólo operaciones puede ser atómica.

Lectura y escritura de un tipo de datos que cabe en una sola palabra (int en un procesador de 32 bits, long en un procesador de 64 bits) es técnicamente "atómica", pero la fluctuación de fase y / o procesador puede decidir cambiar el orden de las instrucciones y crear así las condiciones de carrera inesperados, así que o bien tiene que serializar el acceso con lock, utilice la clase Interlocked para escrituras (y en algunos casos se lee), o declarar la variable volatile.

La respuesta corta es: Si dos hilos diferentes pueden acceder al mismo campo / variable y al menos uno de ellos va a escribir, es necesario utilizar algún tipo de bloqueo. Para los tipos primitivos eso es por lo general la clase Interlocked.

Otros consejos

aquí

  

Para obtener la respuesta definitiva vaya a la   Especificaciones. :)

     

Partición I, sección 12.6.6 de la CLI   especificación establece que: "Una CLI conforme deberá   garantizar que el acceso de lectura   a alineado correctamente las posiciones de memoria   no más grande que el tamaño de la palabra nativa es   atómica cuando todos los accesos de escritura a   un lugar son del mismo tamaño. "

     

Para que confirma que s_Initialized   nunca será inestable, y que lee   y escribe en primitve tipos son   atómico.

     

Enclavamiento crea una barrera de memoria   para evitar que el procesador de   reordenamiento lee y escribe. La cerradura   crea la barrera sólo se requiere en   este ejemplo.

     

Juan.

En esencia, usted no tiene un problema de "choque" de no bloqueo de un bool. Lo que puede tener es una condición de carrera para el fin de la cual se actualiza o se lee el bool. Si desea que el garuntee bool se escribe / lee de en un orden específico, entonces usted querrá usar algún tipo de mecanismo de bloqueo.

Ordenar de. Hay un excelente hilo sobre este aquí , pero la versión corta es, mientras que una dada de lectura o escritura puede ser atómica, eso es casi nunca es lo que está haciendo. Por ejemplo, si quieres incrementar un número entero, es necesario 1) leer el valor, 2) añadir uno al valor y 3) almacenar el valor de nuevo. Cualquiera de estas operaciones se puede interrumpir.

Esa es la razón de clases como "entrelazada".

estáticas tipos primitivos son multi-hilo, por lo que no es necesario para bloquear esas variables con tipo. Sin embargo, cualquier variable de instancia de un tipo primitivo no se garantiza que sea. Ver aquí: son tipos primitivos como multi-hilo bool

MSDN PrimitiveType Clase

Y aquí hay otro enlace útil que también puede ser de interés que me parece la solución muy convincente: SO Pregunta: ¿Cómo puedo saber si un método de C # es seguro para subprocesos?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top