Volatile resolverá su problema, es decir. garantizará la coherencia entre todos los cachés del sistema. Sin embargo, será ineficaz ya que actualizará la variable en memoria para cada acceso R o W. Puede considerar utilizar una barrera de memoria, solo cuando sea necesario. Si está trabajando con o gcc/ICC tienen un aspecto de sincronización empotrados: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
EDITAR (en su mayoría sobre el comentario PM100): entiendo que mis creencias no son una referencia, de manera que he encontrado algo citar :)
La palabra clave volátil se diseñó para evitar las optimizaciones del compilador que pueden hacer que el código sea incorrecto en presencia de ciertos eventos asincrónicos.Por ejemplo,Si se declara una variable primitiva tan volátil, el compilador no está permitido para almacenar en caché en un registro
De Dr Dobb's
Más interesante:
campos volátiles son linealizable. Leer un campo volátil es como adquirir un candado; la memoria de trabajo se invalida y el valor actual del campo volátil se vuelve a leer de la memoria. Escribir un campo volátil es como soltar un candado: el campo volátil se escribe de inmediato en la memoria. (esto es todo acerca de la consistencia, no se trata de atomicidad)
de El arte de la programación de multiprocesador, Maurice Herlihy & Nir Shavit
bloqueo contiene código de sincronización de memoria, si no de bloqueo, debe hacer algo y usar palabras clave volátiles es probablemente lo más simple que puede hacer (incluso si fue diseñado para dispositivos externos con memoria atada al espacio de direcciones, no es el punto aquí)
¿Qué te hace pensar que las escrituras serán atómicas? – bmargulies
No soy un experto en multihilo, pero siempre implementaría el bloqueo de cualquier recurso compartido ... –
He hecho este tipo de cosas en un procesador PowerPC single-core integrado y funciona de manera confiable. Mejor no hacer ninguna lectura-modificación-escritura (como '++ sharedInt') si es posible que dos hilos tengan acceso de escritura. (En realidad, si dos hilos pueden escribir, probablemente solo sea útil si limita ** cuando ** pueden escribir. Por ejemplo, el hilo A puede cambiar 'sharedInt' de 0 a 1, mientras que el hilo B puede cambiarlo de 1 a 0.) – Dan