4

私はJavaから来ているので、mutexではなく同期に精通しています。pthread_mutex_tも再入可能かどうか疑問に思います。そうでない場合、これには別のメカニズムがありますか?

ありがとうございました

4

3 に答える 3

10

これはミューテックスのタイプによって異なります。デフォルトではチェックは行われず、同じスレッドで複数回ロックしようとすると、未定義の動作が発生します。ここでそれについて読んでください

タイプのミューテックスを作成して、PTHREAD_MUTEX_RECURSIVE再帰的にロックできるようにすることができます。これは、pthread_mutexattr_t に目的のミューテックスタイプをpthread_mutex_initに提供することによって行われます。

于 2012-07-19T19:31:00.453 に答える
3

マニュアルによると、ミューテックスオブジェクトをPTHREAD_MUTEX_RECURSIVEとして宣言できます。

ミューテックスタイプがPTHREAD_MUTEX_RECURSIVEの場合、ミューテックスはロックカウントの概念を維持する必要があります。スレッドが初めてミューテックスを正常に取得するとき、ロックカウントは1に設定されます。スレッドがこのミューテックスを再ロックするたびに、ロックカウントが1ずつ増加します。スレッドがミューテックスのロックを解除するたびに、ロックカウントが1つ減らされます。ロックカウントがゼロに達すると、ミューテックスは他のスレッドが取得できるようになります。スレッドがロックされていないミューテックスまたはロック解除されているミューテックスのロックを解除しようとすると、エラーが返されます。

pthread_mutex_attr_settypeも参照してください。

于 2012-07-19T19:31:09.787 に答える
2

デフォルトでpthread_mutexは再帰的ではありませんが、再帰的に初期化する方法があります:

      pthread_mutexattr_t Attr;
      pthread_mutexattr_init(&Attr);
      pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
      pthread_mutex_init(&_mutex, &Attr);
于 2015-09-02T19:02:35.323 に答える