2010-05-09 7 views
12

¿Tener 2 hilos diferentes:
seguridad de rosca en arrays de C#

  • una lectura de un C# array (por ejemplo, de primera ubicación),
  • y otro escrito a la misma C# matriz, pero a una ubicación diferente (por ejemplo, a la última ubicación)

¿es seguro o no?
(Y me refiero aquí sin bloqueo lectura o escritura)

Respuesta

8

Este caso particular es seguro, sí.

Leer y escribir en diferentes partes de una matriz no interfiere con las otras operaciones.

Sin embargo, leer y escribir en el mismo lugar puede causarle problemas, dependiendo del tipo de elemento y el tamaño de los elementos.

+1

Siempre y cuando esos elementos estén en palabras separadas de la CPU – Stewart

+0

+1 Nunca pensé que esto sería inseguro, pero entiendo por qué lo es. ¡Gracias! –

+0

Es importante tener en cuenta cuando se usan algoritmos sin bloqueo que lo que usted considera como "la misma posición" no es lo mismo que lo que las CPU piensan como la misma posición. La vista de CPU de la memoria es muy diferente de la vista, los lenguajes como C nos dan los bytes que ocupan las direcciones. En algunas arquitecturas de CPU (especialmente ARM, Power) en algunos tipos de datos, incluso esto puede no ser seguro – Stewart

5

Relato abreviado: Sí. Siempre y cuando se trate de dos lugares diferentes, es una operación segura.

Hubo un discussion about this hace un tiempo, tiene algo de información útil si tiene curiosidad.

+0

+1 Nunca pensé que esto sería inseguro, pero entiendo por qué lo es. ¡Gracias! –

7

No estoy seguro de que esto esté garantizado. Imagina que tienes byte []. Esos bytes están estrechamente empaquetados en la memoria. Ahora, si modifica esos bytes, el compilador puede fusionar algunas de las escrituras para realizar operaciones de escritura de modificación de lectura de tamaño de palabra (32 bits). En algunas CPU, ARM por ejemplo, este es el único tipo de instrucción de modificación de memoria que tiene el compilador. Esto es especialmente útil si está modificando más de un byte a la vez. La CPU puede hacer lo mismo también. También puede reordenar cosas sin que usted lo sepa. En vista de ese tipo de optimización, es posible que un hilo que lea la memoria adyacente vea modificaciones parciales. Normalmente no se ve este tipo de efecto porque el asignador de pila es bueno para usted y siempre le da memoria que está al menos alineada con la palabra.

+1

+1: En mi opinión, esta es la mejor respuesta. Siempre es mejor ser escéptico de los modismos de enhebrado sin bloqueo. Puedo pensar en todo tipo de problemas de barrera de memoria que podrían causar problemas incluso si los subprocesos funcionaban con diferentes posiciones de matriz. Simplemente no se proporciona suficiente información en la pregunta para dar una respuesta definitiva. –