Tengo una pregunta bastante específica sobre la programación simultánea en C. He hecho bastante investigación sobre esto pero he visto varias respuestas conflictivas, así que espero alguna aclaración. Tengo un programa que es algo así como lo siguiente (lo siento por el bloque de código bastante largo):acceso variable concurrente en c
typedef struct {
pthread_mutex_t mutex;
/* some shared data */
int eventCounter;
} SharedData;
SharedData globalSharedData;
typedef struct {
/* details unimportant */
} NewData;
void newData(NewData data) {
int localCopyOfCounter;
if (/* information contained in new data triggers an
event */) {
pthread_mutex_lock(&globalSharedData.mutex);
localCopyOfCounter = ++globalSharedData.eventCounter;
pthread_mutex_unlock(&globalSharedData.mutex);
}
else {
return;
}
/* Perform long running computation. */
if (localCopyOfCounter != globalSharedData.eventCounter) {
/* A new event has happened, old information is stale and
the current computation can be aborted. */
return;
}
/* Perform another long running computation whose results
depend on the previous one. */
if (localCopyOfCounter != globalSharedData.eventCounter) {
/* Another check for new event that causes information
to be stale. */
return;
}
/* Final stage of computation whose results depend on two
previous stages. */
}
Hay un grupo de subprocesos que sirven a la conexión de datos de entrada, por lo que varias instancias de newData puede estar en ejecución al mismo tiempo, . En un entorno multiprocesador, conozco dos problemas para corregir el código de este código: evitar que el compilador guarde en caché la copia del contador compartido en un registro para que otros subprocesos no puedan verlo y forzar CPU para escribir el almacenamiento del valor del contador en la memoria de manera oportuna para que otros subprocesos puedan verlo. Preferiría no utilizar una llamada de sincronización alrededor de las comprobaciones del contador porque una lectura parcial del valor del contador es aceptable (producirá un valor diferente al de la copia local, que debería ser adecuado para concluir que se ha producido un evento). ¿Sería suficiente declarar el campo eventCounter en SharedData como volátil, o tengo que hacer algo más aquí? También hay una mejor manera de manejar esto?
Tiene toda la razón sobre la copia local, solo corrigí ese error en mi texto. – user98166