2016-11-09 115 views
1

爲什麼這個代碼是壞有人可以給我解釋一下:互斥理解

int data; 
void* worker(void* arg __attribute__((unused))) { 
    pthread_mutex_t m; 
    pthread_mutex_init(&m, NULL); 
    for (int i = 0; i < N; i++) { 
     pthread_mutex_lock(&m); 
     data++; 
     pthread_mutex_unlock(&m); 
    } 
    pthread_mutex_destroy(&m); 
    return NULL; 
} 

這是確定的:

int data; 
pthread_mutex_t m; 
void* worker(void* arg __attribute__((unused))) { 
    for (int i = 0; i < N; i++) { 
     pthread_mutex_lock(&m); 
     data++; 
     pthread_mutex_unlock(&m); 
    } 
    return NULL; 
} 
// ... 
pthread_mutex_init(&m, NULL); 
// ... 
pthread_mutex_destroy(&m); 
// .. 

我總是需要在全球範圍內聲明的變量互斥?

+0

錯誤代碼的實際含義是什麼? –

+0

它在某些輸入上無法正常工作。 – Welez

+0

http://stackoverflow.com/a/12776593/4593781,這篇文章可以幫助 –

回答

0

與當地mutex的問題是,這只是一個在mutex的本地訪問版本......因此當thread鎖定,以分享一些全局可訪問數據的mutex,數據本身是不受保護的,因爲所有其他thread將有它自己的本地mutex,可以鎖定和解鎖。它打敗了互相排斥的整個觀點。

我建議也要考慮異常安全。在這個特定的例子中,你只是在mutexlock/unlock中間做data++。那麼如果你在將來會拋出異常,在pthread_mutex_unlock(&m);之前再發表一條陳述呢?閱讀關於RAII