0

そのスレッドが (デストラクタで) 終了するときに、スレッドが保持するミューテックスを自動的に解放する簡単な方法はありますか?

私が取っているアプローチは、それを保持するスレッドの ID を保持する各ミューテックスの構造を作成し、デストラクタでこのリストをスキャンし、ミューテックスが終了中のスレッドと一致する場合はそれを解放することです。しかし、これには実際には競合状態があると考えています。ミューテックスをロックした後、データ構造を設定する前にデストラクタが呼び出されるとどうなりますか?

pthread_mutexattr_setrobust_np も調べましたが、np 関数は移植性がなく、過去に問題があったことを理解しています。

参考までに、各スレッドは TCP/IP 接続に関連付けられており、この接続を介した要求に応じてロック/ロック解除が発生します。接続が異常終了した場合は、クリーンアップする必要があります。つまり、保持されているロックを解放する必要があります。

4

1 に答える 1

0

うまくいくように見える解決策を見つけました。まず、エラー チェック ミューテックス (PTHREAD_ERRORCHECK_MUTEX_INITIALIZERまたはPTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP) を使用します。

次に、デストラクタで、すべてのミューテックスのロックを解除しようとしています。スレッドが所有していないミューテックスはそのままにしておきますが、スレッドが所有しているミューテックスはすべて解放します。

何らかの理由で、スレッドが所有するミューテックスでさえ EPERM を返しますが、別のスレッドからミューテックスを再度ロックしようとすると成功しますが、ロックを解除しようとしないとデッドロックになります。逆に、破壊されたスレッドが所有していない他のミューテックスは、デストラクタの実行後もロックされていることがわかります。

于 2012-07-30T22:24:14.130 に答える