Ho una domanda abbastanza specifica sulla programmazione concorrente in C. Ho fatto un bel po 'di ricerche su questo ma ho visto diverse risposte contrastanti, quindi spero in qualche chiarimento. Ho un programma che è qualcosa di simile alla seguente (scusate per il blocco di codice lunghetto):accesso variabile simultaneo in 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. */
}
C'è un pool di thread a servizio del collegamento per i dati in entrata, in modo più istanze di newData possono essere in esecuzione allo stesso tempo . In un ambiente multiprocessore ci sono due problemi di cui sono a conoscenza nell'ottenere il contatore che gestisce parte di questo codice in modo corretto: impedire al compilatore di memorizzare nella cache la copia contatore condivisa in un registro in modo che altri thread non possano vederlo e forzare il CPU per scrivere l'archivio del valore del contatore in memoria in modo tempestivo in modo che altri thread possano vederlo. Preferirei non utilizzare una chiamata di sincronizzazione attorno ai contatori perché una lettura parziale del valore del contatore è accettabile (produrrà un valore diverso dalla copia locale, che dovrebbe essere sufficiente per concludere che si è verificato un evento). Sarebbe sufficiente dichiarare volatile il campo eventCounter in SharedData o devo fare qualcos'altro qui? C'è anche un modo migliore per gestire questo?
Si è assolutamente corretto sulla copia locale, ho appena corretto quell'errore nel mio testo. – user98166