2016-06-20 6 views
0

スレッドの初心者として、私はmutexのロジックがどのように機能するかを理解するのが少し難しいです。c - 複数のスレッドがmutexロックされた静的変数を変更する方法

foo() 
{ 
    static int x; 
    X_lock();  //locking 
    x++; 
    X_unlock;  //unlocking 
    return x; 
} 

セマフォとミューテックスの基本的な違いは何でしょう:マルチスレッドは、次のスニペットで動作し、何がおきfoo()コールのためのxの出力になりますどのように理解するのに役立つが必要ですか?簡単な例が良いでしょう。

+0

質問を修正してください。何を試しましたか?どのような資料をお読みになりましたか?正確に何を理解していないのですか?あなたの宿題をする人がいるとは思わないでください –

+0

[このSO Q&A](http://stackoverflow.com/questions/2065747/pthreads-mutex-vs-semaphore)をご覧ください – LPs

+1

複数のスレッドで同時に実行される場合'return x;'の最後のアクセスがmutexによって保護されていないので、あなたのサンプルは、非アトミックな、 'x'への読み取り専用でないアクセスのため、未定義の動作を示します。 – EOF

答えて

1

スレッドは同じリソースを使用する必要があり、という特定されていない動作を呼び出すことがあります。例えば、加算はアトミック演算ではないため、この問題を引き起こす可能性があります。だから、ある種ののバリアが必要です。一つのスレッドだけがそのバリ​​アを通過することができ、他のスレッドはそのスレッドが終了するのを待たなければなりません。終わる。

これは競合状態の一例であり、これにはMUTEX(相互排除)が使用されています。ミューテックスはどのように機能しますか?まず、メイン機能でミューテックスを初期化する必要があります。

pthread_mutex_init(&lock, NULL). 

変数pthread_mutex_t lock;はグローバルなので、すべてのスレッドがそれにアクセスすることができます。その後、1つのスレッドロックミューテックスます:

pthread_mutex_lock(&lock); 

そして今は、次のスレッドが、私はちょうど書いたコード行に、この同じポイントになる、とはトラフにそれを渡すことができません。だから、他のすべてのスレッドがこのバリアで待機している - のコード行を、最初のスレッドロック解除ミューテックスまで:

pthread_mutex_unlock(&lock); 

を次にOSからプロセッサ時間を取得したスレッドによっては、トラフのバリアと同じことを通過しますと、すべての上に繰り返されます再び。

ミューテックスは、理解することが非常に重要な概念です。セマフォについては、同じもの、スレッド同期のために使用されており、hereはこのトピックをカバーする優れた記事です。

関連する問題