Если у меня есть некоторый код, который выглядит примерно так:Эти указатели в многопоточной среде
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 предотвращения оптимизатора от перезаписи check_flag как:
void check_flag(foo_t* f) {
bool cache = f->flag;
while(cache)
pthread_cond_wait(&f->c, &f->m);
}
В другом слова, имеет ли сгенерированный код следовать указателю f
каждый раз через цикл или компилятор может вытащить разыменование?
Если это is бесплатно вытащить его, есть ли способ предотвратить это? Нужно ли мне когда-нибудь посыпать волатильное ключевое слово? Он не может быть параметром check_flag
, потому что я планирую иметь другие переменные в этой структуре, что я не возражаю против оптимизации компилятора таким образом.
Я мог бы прибегнуть к:
void check_flag(foo_t* f) {
volatile bool* cache = &f->some_flag;
while(*cache)
pthread_cond_wait(&f->c, &f->m);
}
+1 для размышлений об этом виде проблемы до написания кода с резьбой по пробным ошибкам! –