2017-11-12 4 views
1

ので は、スレッドが経由して、ロックを取得し、1つのスレッドを仮定:Cのスレッドが既にロックを取得しようとするとどうなりますか?

pthread_mutex_lock(&lock); 

のpthreadライブラリはの進歩をブロックします:その後、ロックを解除する前に、それは再びラインに到達した

pthread_mutex_lock(&lock); 

スレッドがすでにロックを保持していることを認識して、それを通過させますか?

+1

試したときにデッドロックしましたか? –

+1

[いくつかのドキュメントを読む](http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html)しましたか? –

+0

私はすでにこれらのことをやってみました。しかし、それを理解できなかったので、私はここで尋ねているのです。 – Bob

答えて

0

POSIXは、さまざまな種類のミューテックスをサポートしています。すべては同じpthread_mutex_tタイプを使用しているので、現在のスレッドによってすでに取得されているロックを再ロックするときには何を行うのかを知ることはできません。

一般的な行動は、次のとおりです。

  • 通常のミューテックスのための自己デッドロック(pthread_mutex_lockを返すことはありません)。
  • エラーチェックミューテックスのエラー(pthread_mutex_lockがエラーコードを返します)。
  • ロック操作は成功し、ロックが他のスレッドがロック(再帰的なミューテックス)に利用できるようになるにはもう一度ロック解除操作が必要になります。

ミューテックスの動作は、属性を使用してpthread_mutex_initで作成すると選択できます。 pthread_mutexattr_initを参照してください。一部のシステムでは、標準のPTHREAD_MUTEX_INITIALIZERのような非標準イニシャライザも用意されています。

7

動作は、ミューテックスの種類によって異なります。 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の場合

マニュアルに従って、デフォルトのタイプは速いですが、それは移植できるように頼ることはできません。

関連する問題