Por ejemplo, ¿necesito bloquear un valor bool
cuando multiprocesos?¿Hay tipos de datos primitivos en C# atomic (thread safe)?
Respuesta
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
.
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
@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
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
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.
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 ?
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?
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".
- 1. Thread-safe C++ stack
- 2. Tipos de datos primitivos multiplataforma en C++
- 3. C + + Thread-Safe Map
- 4. C# Thread Safe Deep Copy
- 5. stdout thread-safe en C en Linux?
- 6. Diseño de estructura de datos Thread-Safe
- 7. ¿NSPersistentStoreCoordinator Thread Safe?
- 8. PHP Thread Safe and Non-Thread Safe para Windows
- 9. ¿Es java.util.Observable thread-safe?
- 10. Thread safe StreamWriter C# ¿cómo hacerlo? 2
- 11. Perl Thread Safe Modules
- 12. Thread Safe Singletons en Java
- 13. Lista de tipos de datos Delphi con operaciones de lectura/escritura 'thread-safe'?
- 14. Nulo para tipos de datos primitivos
- 15. ¿Los punteros son tipos primitivos en C++?
- 16. Buffer circular Thread-safe en Java
- 17. Making Core Data Thread-safe
- 18. Optimización del compilador, ¿Thread Safe?
- 19. Necesito crear una variable estática Thread-safe en C# .Net
- 20. tipos primitivos enumeración - ¿existe
- 21. En SignalR is Hub.Context thread safe?
- 22. ¿Qué significa el objeto 'thread safe'?
- 23. ¿Es rand_s thread-safe de Windows?
- 24. Diseño de una clase Thread Safe
- 25. ¿Los tipos de datos primitivos son seguros para subprocesos en Java
- 26. Java: Arsenal de tipos de datos primitivos no AUTOBOX
- 27. Colección Thread-Safe sin pedido ni duplicados
- 28. ¿Cuál es la diferencia entre thread-aware y thread-safe?
- 29. ¿Los miembros de la entidad deberían ser tipos de datos primitivos o tipos de datos Java?
- 30. Colecciones de Java. ¿Por qué no hay tipos primitivos?
En la mayoría de las situaciones, si está escribiendo desde dos hilos, debe usar un candado ... –
Haría lo que diga Mitch. =) –