Si tengo un programa de subprocesos múltiples que lee una memoria del tipo de caché por referencia. ¿Puedo cambiar este puntero por el hilo principal sin poner en riesgo ninguno de los otros hilos que leen valores inesperados?¿Cambiar un puntero se considera una acción atómica en C?
Como lo veo, si el cambio es atómico, los otros hilos leerán el valor anterior o el más nuevo; nunca memoria aleatoria (o punteros nulos), ¿verdad?
Soy consciente de que probablemente debería utilizar métodos de sincronización de todos modos, pero todavía tengo curiosidad.
¿Los cambios de puntero son atómicos?
Actualización: Mi plataforma es de 64 bits de Linux (2.6.29), aunque me gustaría una respuesta multi-plataforma, así :)
En realidad, no creo que un compilador C (o C++) pueda volver a ordenar workDone = 1 ANTES de una llamada de función que lo precede, a menos que sepa algo más sobre workDone (como la palabra clave "noalias" nunca aprobada). Por otro lado, si tuviera foo = bar; qwerty = uiop; workDone = 1, luego workDone = 1 podría moverse (o incluso temporalmente ser un valor de solo registro, si workDone no es volátil). Si ReceiveResultsOfWork mira qwerty o foo, es posible que no obtenga uiop o bar, aunque workDone sea 1. Tendría que verificar qué sucede si DoWork() termina en línea. – jesup
El compilador puede hacer ese reordenamiento si puede demostrar que DoWork no tiene acceso a workDone de ninguna manera definida. Esto realmente puede suceder si DoWork es lo suficientemente pequeño y está en la misma unidad de traducción y el compilador decide alinearlo. – derobert
Lo importante es que el compilador no está obligado por el estándar para asegurarse de que se escriba workDone después de la llamada a DoWork(). En la práctica, definitivamente es correcto: si DoWork() es una llamada de función real, el compilador probablemente no reordene. Si DoWork está incluido, workDone podría reordenarse fácilmente antes de DoWork() o durante él. – Michael