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