अगर मैं कुछ कोड है कि तरह दिखता है:के बाद संकेत दिए गए
void check_flag(foo_t* f) {
bool cache = f->flag;
while(cache)
pthread_cond_wait(&f->c, &f->m);
}
अन्य में:
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);
}
वहाँ सी मानक में कुछ भी रूप में check_flag पुनर्लेखन से एक अनुकूलक रोक रहा है शब्द, क्या उत्पन्न कोड है जो लूप के माध्यम से हर बार 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 इस तरह के मुद्दे के बारे में सोचने के लिए परीक्षण और त्रुटि से थ्रेडेड कोड लिखने से पहले! –