2011-09-28 12 views
6

Tengo varios hilos que leen la misma variable int. y un hilo está escribiendo el valor.¿Es seguro leer de varios subprocesos?

No me importa la condición de carrera.

solo mi preocupación es escribir y leer el valor int al mismo tiempo ¿es seguro para la memoria?

y no provocará la falla de ninguna aplicación.

+0

posible duplicado de [Son lecturas de C++ y escrituras de un int atomic] (http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic) – Sjoerd

Respuesta

4

Sí, eso debería estar bien. La única forma en que puedo imaginar que falla es si uno de los hilos desasigna la memoria que respalda ese entero. Para obtener los mejores resultados, también me aseguraré de que los enteros estén alineados en los límites sizeof(int). (Algunas CPU no pueden acceder a enteros en absoluto sin esta alineación. Otros proporcionan garantías de atomicidad más débiles para el acceso desalineado).

+1

asegúrese de que los números enteros estén alineados en sizeof (int) ¿puede proporcionar más información sobre cómo puedo hacer eso? –

+0

@VivekGoel En la mayoría de los casos, su compilador lo hará por usted. Pero hay formas específicas de compilación para lograr esto, es decir '__atribuir __ ((alineado (4)))' para GCC. – asveikau

+0

@VivekGoel - También puede hacer cosas para verificar esto en tiempo de ejecución, es decir, '((uintptr_t) & x)% sizeof (int)' debe ser cero. (Y tal vez incluso pueda agregar un 'assert' para eso.) – asveikau

0

En todas las plataformas Linux que conozco, las lecturas y escrituras de las int alineadas son atómicas y seguras. Nunca leerá un valor que no fue escrito (sin rasgado de palabras). Nunca causarás una falla o bloqueo.

+0

Creo que este tipo de afirmaciones amplias realmente necesitan una referencia. Además, ¿qué significa exactamente alineado en este contexto? – sehe

+0

Si alguien no sabe qué es un entero alineado, no tiene que escribir programas multiproceso. –

+0

oh real encantador. Además, demasiado generalizado. Bueno, no necesitas molestarte, por supuesto. Hay otras respuestas sobre SO que arrojan más luz. – sehe

2

Sí, en x86 y x86-64, siempre que el valor que está leyendo esté alineado correctamente. 32 bits int s, necesitan estar alineados en un límite de 4 bytes para que el acceso sea atomic al leer o escribir, que casi siempre será el caso a menos que salga de su camino para crear int s no alineados (diga , utilizando una estructura empaquetada o haciendo aritmética de conversión/puntero con almacenamientos intermedios de bytes).

Probablemente también desee declarar su variable como volatile para que el compilador genere código que recuperará la variable de la memoria cada vez que se acceda a ella. Eso evitará que realice optimizaciones como el almacenamiento en caché en un registro cuando podría ser alterado por otro hilo.

+0

+1 para volátil y, de hecho, mencionar el módulo de alineación – sehe

Cuestiones relacionadas