如果我有一些代码,看起来类似:以下指导
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);
}
+1在尝试通过试错法编写线程代码之前思考此类问题! – 2011-01-14 01:17:29