2016-11-09 12 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; 
} 

そして、これはokです:

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に問題がthreadは、いくつかのグローバルにアクセス可能なデータを共有するためにmutexをロックしたときにそのため、データ自体が他のすべてのthreadいるため、保護されていない...それはmutexのローカルでのみアクセス可能バージョンだということですそれはそれ自身のローカルmutexを持つことができますロックされているとロックを解除することができます。それは相互排除の全ポイントを打ち負かします。

例外安全性についてもお勧めします。この特定の例では、mutexlock/unlockの真ん中にあるdata++を実行しています。では、例外をスローする可能性があるpthread_mutex_unlock(&m);の前に別の文を入れている場合はどうでしょうか。 RAIIについて読む