2010-03-12 12 views

Respuesta

15

No existe un tipo atómico . Solo las operaciones pueden ser atómicas.

de 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 para reordenar instrucciones y así crear condiciones de carrera inesperadas, por lo que necesita serializar el acceso con lock, usar la clase Interlocked para escribir (y en algunos casos leer), o declarar la variable volatile.

La respuesta corta es: si dos subprocesos diferentes pueden acceder al mismo campo/variable y al menos uno de ellos estará escribiendo, deberá usar algún tipo de bloqueo. Para tipos primitivos que generalmente es la clase Interlocked.

+0

Sí, una operación puede ser atómica o no, pero existen tipos de datos específicos que se conocen como tipos atómicos porque permiten operaciones atómicas debido a sus requisitos de tamaño de memoria con respecto al tamaño de palabra en el sistema. – NebuSoft

+1

@NebuSoft: ¿a quién o qué? Ciertamente no por la especificación C#. Consulte la sección 5.5, * Atomicity of variable references *, que se refiere específicamente a la atomicidad de * reads * y * write * - no de los tipos en sí. Cada tipo se puede hacer para permitir operaciones atómicas específicas, y solo se necesitan dos líneas de código para realizar una operación no atómica en un tipo primitivo. – Aaronaught

+3

Lo siento, me refería a los términos en general: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html http://www-2.cs.cmu.edu/afs/cs/project/pscico/doc/nesl/manual/node14.html http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp ? topic =/com.ibm.ddi.doc/ddi160.htm http://download.oracle.com/docs/cd/B28359_01/gateways.111/b31053/ims_datatype_conver.htm Simplemente estoy señalando que es común referirse a una variable como atómica basada en el tipo en un sentido general. – NebuSoft

2

pregunta similar here

Para la respuesta definitiva ir a la especificación . :)

partición I, sección 12.6.6 de la CLI estados de especificaciones: "Un CLI conforme deberá garantía de que leer y escribir el acceso a posiciones de memoria alineados correctamente no más grande que el tamaño de la palabra nativa es atómica cuando todos los accesos de escritura a una ubicación son del mismo tamaño ".

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

El enclavamiento crea una barrera de memoria para evitar que el procesador reordene las lecturas y escrituras. El bloqueo crea la única barrera requerida en en este ejemplo.

John.

Básicamente, no tendrás un problema de "bloqueo" al no bloquear un bool. Lo que puede tener es una condición de carrera para el orden en que se actualiza o lee el bool. Si quieres asegurarte de que el bool está escrito/leído en un orden específico, entonces querrás usar algún tipo de mecanismo de bloqueo.

1

Los tipos primitivos estáticos son seguros para la realización de hilos, por lo que no es necesario bloquear esas variables tipadas. Sin embargo, no se garantiza que exista ninguna variable de instancia de un tipo primitivo. Ver aquí: Are primitive types like bool threadsafe ?

MSDN PrimitiveType Class

Y aquí hay otro enlace útil que también puede ser de interés que me parece la solución muy convincente: SO Pregunta: How do I know if a C# method is thread safe?

2

o menos. Hay un hilo excelente acerca de este here, pero la versión corta es, mientras que una lectura o escritura determinada puede ser atómica, eso casi nunca es lo que estás haciendo. Por ejemplo, si desea incrementar un número entero, necesita 1) leer el valor, 2) agregar uno al valor y 3) almacenar el valor nuevamente. Cualquiera de esas operaciones puede ser interrumpida.

Ese es el motivo de las clases como "Interbloqueado".

Cuestiones relacionadas