組み込み 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 のミューテックスを作成する必要があり、作成することもできません。