In caso ho qualche codice che sembra qualcosa di simile:seguito puntatori in un ambiente di multithreading
typedef struct {
bool some_flag;
pthread_cond_t c;
pthread_mutex_t m;
} foo_t;
// I assume the mutex has already been locked, and will be unlocked
// some time after this function returns. For clarity. Definitely not
// out of laziness ;)
void check_flag(foo_t* f) {
while(f->flag)
pthread_cond_wait(&f->c, &f->m);
}
C'è qualcosa nello standard C impedendo un ottimizzatore di riscrittura check_flag come:
void check_flag(foo_t* f) {
bool cache = f->flag;
while(cache)
pthread_cond_wait(&f->c, &f->m);
}
In altre parole, il codice generato ha per seguire il puntatore f
ogni volta attraverso il ciclo, oppure il compilatore è libero di estrarre la dereferenziazione?
Se lo è libero di estrarlo, esiste un modo per impedirlo? Devo aggiungere una parola chiave volatile da qualche parte? Non può essere il parametro di check_flag
perché ho in programma di avere altre variabili in questa struttura che non mi interessa il compilatore che ottimizza in questo modo.
potrei ricorrere a:
void check_flag(foo_t* f) {
volatile bool* cache = &f->some_flag;
while(*cache)
pthread_cond_wait(&f->c, &f->m);
}
+1 per pensare a questo tipo di problema prima di scrivere codice threadato per tentativi ed errori! –