, así que tengo un tipo booleano en C++ en una máquina multiprocesador. La variable comienza la vida como verdadera, y luego hay algunos hilos, uno o más de los cuales podrían escribirlo como falso.¿Debo proteger esta variable con un bloqueo?
Al mismo tiempo, estos hilos también pueden leer esta variable para verificar su estado. No me importa si la lectura de esta variable está sincronizada con cualquiera de las escrituras, cada una sucede en lugares diferentes en el código, y no importa si aparece antes o después de una escritura en particular. Ahora, ¿necesito un candado para este booleano?
La única forma en que necesitaría un bloqueo es que, si el nivel es muy bajo, la memoria se puede corromper con dos escrituras compitiendo. Si, por ejemplo, una instrucción de ensamblaje en el procesador A está escribiendo 0 en el byte que representa el booleano al mismo tiempo que el procesador B está haciendo lo mismo ... y en lugar de haber escrito 0, la memoria termina con el valor 22 o alguna cosa. Eso podría estropear algo.
Entonces, en general, si el proceso A está escribiendo 3 en una ubicación de memoria, mientras que el proceso B está escribiendo 7, sin sincronización, ¿tengo garantizado que terminará al menos con 3 o 7? ¿O es tan fácil romper la memoria?
Editar:
Gracias por los comentarios chicos. Algo más de información: hay sincronización en el programa, por supuesto. Para resumir, la bandera en cuestión dice si un grupo de memoria determinado está "sucio" (necesita ser compactado). Cualquier hilo puede, por lo tanto, decidir establecer este indicador en falso (lo que significa que el grupo está sucio). Por ejemplo, liberar memoria de la agrupación la ensucia. Cualquier hilo también puede leer este indicador y establecer otro indicador para indicar que se necesita una limpieza: esta comprobación se realiza cuando la memoria se asigna desde el grupo, la limpieza se señala si tenemos poca memoria. En algún lugar de mi sección crítica maestra entre iteraciones, donde cada hilo va a buscar más datos para procesar, haré que los hilos comprueben este segundo indicador, y haré algo apropiado para asegurarme de que: todos los otros temas terminen su iteración actual, un hilo limpia la memoria, establece el primer indicador en verdadero (como en el grupo no está sucio), establece el segundo indicador en falso, y luego libera todos los hilos de nuevo.
Así que no creo que necesite un bloqueo porque: un bloqueo garantizaría que una escritura no ocurra al mismo tiempo que otra escritura o lectura. Pero a quién le importa, siempre y cuando el hardware no me falle, el peor de los casos es que la lectura ocurra al azar antes o después de la escritura; esto es lo mismo que sucedería si lo protegiera con un candado, en ese momento tendríamos realmente asegurémonos de que vino antes o después ...
Creo que el mismo argumento se aplica a la segunda bandera que mencioné anteriormente.
Fuera de interés, ¿por qué no te importan las lecturas? Supongamos que algún hilo ha escrito falso, entonces, si no le importa si la lectura da como resultado 'verdadero' o 'falso', ¿por qué molestarse en leer? ¿Es solo que las lecturas "verdaderas" "incorrectas" son inofensivas? –