ので は、スレッドが経由して、ロックを取得し、1つのスレッドを仮定:Cのスレッドが既にロックを取得しようとするとどうなりますか?
pthread_mutex_lock(&lock);
のpthreadライブラリはの進歩をブロックします:その後、ロックを解除する前に、それは再びラインに到達した
pthread_mutex_lock(&lock);
スレッドがすでにロックを保持していることを認識して、それを通過させますか?
ので は、スレッドが経由して、ロックを取得し、1つのスレッドを仮定:Cのスレッドが既にロックを取得しようとするとどうなりますか?
pthread_mutex_lock(&lock);
のpthreadライブラリはの進歩をブロックします:その後、ロックを解除する前に、それは再びラインに到達した
pthread_mutex_lock(&lock);
スレッドがすでにロックを保持していることを認識して、それを通過させますか?
POSIXは、さまざまな種類のミューテックスをサポートしています。すべては同じpthread_mutex_t
タイプを使用しているので、現在のスレッドによってすでに取得されているロックを再ロックするときには何を行うのかを知ることはできません。
一般的な行動は、次のとおりです。
pthread_mutex_lock
を返すことはありません)。pthread_mutex_lock
がエラーコードを返します)。ミューテックスの動作は、属性を使用してpthread_mutex_init
で作成すると選択できます。 pthread_mutexattr_init
を参照してください。一部のシステムでは、標準のPTHREAD_MUTEX_INITIALIZER
のような非標準イニシャライザも用意されています。
動作は、ミューテックスの種類によって異なります。 POSIX standardは、スレッドが次の表の再ロック欄に記載されpthread_mutex_lock()
が振る舞うもの、それはすでにロックしたmutexを再度ロックしようとすると、再帰的なロック動作がロック
の種類に依存していることを述べています。再ロック列で
PTHREAD_MUTEX_NORMAL
のミューテックスがタイプPTHREAD_MUTEX_ERRORCHECK
のミューテックスがタイプPTHREAD_MUTEX_RECURSIVE
のミューテックスが再帰として動作するエラーPTHREAD_MUTEX_DEFAULT
のミューテックスには未定義の動作実際には、そのプラットフォーム上でデフォルトのロックが上記の3つのタイプのいずれかである場合、それは上記のカラムと同じように動作し、他のタイプの場合、その動作は未定義となります。したがってテスト行動が何であるかを見つけるためにPTHREAD_MUTEX_DEFAULT
ロックにはポイントは特にありません。
そしてLinux manuals pthread_mutex_lock(3)
は、次のようにrephrases:mutexが呼び出し側のスレッドにより既にロックされている場合
、pthread_mutex_lockのの 挙動は、ミューテックスの 種類に依存します。ミューテックスがファスト 種類の場合、ミューテックス がロック解除されるまで、呼び出し元のスレッドは中断され、結果的に呼び出す スレッドがデッドロックする原因となります。ミューテックスがのエラー の場合、の種類をチェックすると、pthread_mutex_lockはエラーコード
EDEADLK
を返します。 mutexが種類の である場合、pthread_mutex_lock
が成功し、直ちに戻ります。呼び出し元のスレッドがmutexをロックした回数 を記録します。 と等しい数のpthread_mutex_unlock
操作は、mutexがロック解除された 状態に戻る前に実行する必要があります。 を実行する必要があります。 Linuxの場合
マニュアルに従って、デフォルトのタイプは速いですが、それは移植できるように頼ることはできません。
試したときにデッドロックしましたか? –
[いくつかのドキュメントを読む](http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html)しましたか? –
私はすでにこれらのことをやってみました。しかし、それを理解できなかったので、私はここで尋ねているのです。 – Bob