13

組み込み Linux OS (uClinux) でアプリケーションを開発していますが、(同じスレッドで) ミューテックスを複数回ロックできるようにする必要があります。

次のように定義および初期化されたミューテックスとミューテックス属性があります。

pthread_mutexattr_t waiting_barcode_mutexattr;
pthread_mutex_t waiting_barcode_mutex;

pthread_mutexattr_init(&waiting_barcode_mutexattr);
pthread_mutexattr_settype(&waiting_barcode_mutexattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&waiting_barcode_mutex, &waiting_barcode_mutexattr);

しかし、ロックを 2 回取得しようとすると、2 回目のロックでブロックされます。

pthread_mutex_lock(&waiting_barcode_mutex);
pthread_mutex_lock(&waiting_barcode_mutex);

私はそれを間違って初期化していますか、それとも同じことを達成するためのより良い方法はありますか?

前もって感謝します。

結論:

  • どうやら PTHREAD_MUTEX_RECURSIVE または PTHREAD_MUTEX_RECURSIVE_NP が機能しないため、再入可能ミューテックスを作成できません。
  • try_lock もダメです。取得できる場合はロックを取得し、取得できない場合はエラーを返します。残念ながら、エラーはミューテックスが既に使用されていることを通知するだけで、現在のスレッドがすでにロックを所有しているかどうかを確認できません。
  • 現在のスレッドにロックがある場合、pthread_mutex_lock はエラーを返す可能性がありますが、そのためにはタイプ PTHREAD_MUTEX_ERRORCHECK のミューテックスを作成する必要があり、作成することもできません。
4

5 に答える 5

10

これはあなたが期待することをしていませんか?

最初の呼び出しでロックが取得され、2 番目の呼び出しは最初のロックが解放されるまでブロックされます ( pthread_mutex_unlock)。これがロックの機能です。

ドキュメントから:

「ミューテックスがすでにロックされている場合、呼び出し元のスレッドはミューテックスが使用可能になるまでブロックされます。」

おそらくあなたがしたいpthread_mutex_trylockですか?あなたが何を達成しようとしているのかを知らなければ、それを言うのは難しい.

修正:

あなたが PTHREAD_MUTEX_RECURSIVE を設定しているとは思いませんでした....これについてもう少し考えさせてください。

考えた後:

Google codesearch を調べてみると、すべてのライブラリで PTHREAD_MUTEX_RECURSIVE が実装されているわけではないようです。PTHREAD_MUTEX_RECURSIVE_NP を試すか、これを回避するために何か凝ったことをする必要があるかもしれません。

于 2010-05-12T17:39:26.517 に答える
3

pthread ミューテックスは再入可能ではないようです。スレッドが既にミューテックスをロックしているかどうかを示すフラグを使用して、これを回避できます。

bool haveLock = false;// スレッド変数
pthread_mutex_t waiting_barcode_mutex; // スレッド変数も

マイロック()
{
   if( haveLock ) return; // 2 回ロックする必要はありません
   pthread_mutex_lock(&waiting_barcode_mutex);
   haveLock = true;
}

myunlock()
{
   haveLock = false;
   pthread_mutex_unlock(&waiting_barcode_mutex); // またはロック解除呼び出しが何であれ
}
于 2010-05-12T17:40:02.693 に答える