Следование указателям в многопоточной среде

Если у меня есть код, который выглядит примерно так:

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);
}
6
задан Clark Gaebel 14 January 2011 в 00:19
поделиться