私はJavaから来ているので、mutexではなく同期に精通しています。pthread_mutex_tも再入可能かどうか疑問に思います。そうでない場合、これには別のメカニズムがありますか?
ありがとうございました
私はJavaから来ているので、mutexではなく同期に精通しています。pthread_mutex_tも再入可能かどうか疑問に思います。そうでない場合、これには別のメカニズムがありますか?
ありがとうございました
これはミューテックスのタイプによって異なります。デフォルトではチェックは行われず、同じスレッドで複数回ロックしようとすると、未定義の動作が発生します。ここでそれについて読んでください。
タイプのミューテックスを作成して、PTHREAD_MUTEX_RECURSIVE
再帰的にロックできるようにすることができます。これは、pthread_mutexattr_t に目的のミューテックスタイプをpthread_mutex_initに提供することによって行われます。
マニュアルによると、ミューテックスオブジェクトをPTHREAD_MUTEX_RECURSIVEとして宣言できます。
ミューテックスタイプがPTHREAD_MUTEX_RECURSIVEの場合、ミューテックスはロックカウントの概念を維持する必要があります。スレッドが初めてミューテックスを正常に取得するとき、ロックカウントは1に設定されます。スレッドがこのミューテックスを再ロックするたびに、ロックカウントが1ずつ増加します。スレッドがミューテックスのロックを解除するたびに、ロックカウントが1つ減らされます。ロックカウントがゼロに達すると、ミューテックスは他のスレッドが取得できるようになります。スレッドがロックされていないミューテックスまたはロック解除されているミューテックスのロックを解除しようとすると、エラーが返されます。
pthread_mutex_attr_settypeも参照してください。
デフォルトでpthread_mutex
は再帰的ではありませんが、再帰的に初期化する方法があります:
pthread_mutexattr_t Attr;
pthread_mutexattr_init(&Attr);
pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&_mutex, &Attr);