Nếu tôi có một số mã trông giống như sau:gợi ý sau trong một môi trường đa luồng
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ó điều gì trong tiêu chuẩn C ngăn ngừa một ưu từ viết lại check_flag như:
void check_flag(foo_t* f) {
bool cache = f->flag;
while(cache)
pthread_cond_wait(&f->c, &f->m);
}
Trong khác các từ, mã được tạo có để theo dõi con trỏ f
mỗi lần qua vòng lặp hay trình biên dịch miễn phí để kéo dereference ra?
Nếu số là miễn phí để rút ra, có cách nào để ngăn chặn điều này không? Tôi có cần phải rắc một từ khóa dễ bay hơi ở đâu đó không? Nó không thể là tham số của check_flag
bởi vì tôi có kế hoạch có các biến khác trong cấu trúc này mà tôi không nhớ trình biên dịch tối ưu hóa như thế này.
Tôi có thể phải nghỉ mát để:
void check_flag(foo_t* f) {
volatile bool* cache = &f->some_flag;
while(*cache)
pthread_cond_wait(&f->c, &f->m);
}
+1 để suy nghĩ về loại sự cố này trước khi viết mã luồng bằng thử và lỗi! –