1

私のアプリケーション (C++/Linux) では、キャンセル中にスレッドがミューテックス (再帰) を取得することがあります。これにより、他のスレッドも同じミューテックスを使用し、それを取得できないため、デッドロックが発生します。

そのスレッドがミューテックスをロックしているかどうかを確認できるようになりました。私の動機は、スレッドがロックしていることを手動でクリアしてから、スレッドをキャンセルすることです。

私が考えることができる 1 つの可能な方法は、カウンターを維持することです。より良いアプローチも歓迎されます..

前もって感謝します

4

3 に答える 3

4

多くのライブラリは、Windows のTryEnterCriticalSectionと同様のメカニズムを提供します。これにより、ミューテックスが占有されていることを示す信号が返された場合は、答えがあります。

しかし、これよりもはるかに大きな問題があります。適切に設計されたマルチコード アプリケーションでは、デッドロックや競合状態が発生することはなく、別のスレッドに手動でアクセスしてその状態を操作する必要もありません。

ハックを書く代わりに、バグを修正する必要があります。

于 2012-05-11T20:40:57.667 に答える
1

pthread_cancel()一般的に、このような問題があるため、使用は避けてください。これを使用する必要がある場合は、pthread_cleanup_pushとpthread_cleanup_popを使用して、スレッドがキャンセルされた場合にミューテックスのロックが解除されるようにする必要があります。

誰かが呼び出された場合に正しい実行を保証する方法はまったくpthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS)ないので、そうしないでください。

pthread_cancel()とてもCっぽいです。C ++でプログラミングしているので、Boostのスレッド割り込みの使用を検討してください。これは、スコープ付きロックオブジェクトでうまく構成されます。

于 2012-05-14T00:19:14.217 に答える
0

John が述べたように、主な問題はアプリケーションの設計です。

ヒント: C++ で、失敗 (スロー) した場合に実行されることが保証されている唯一のものは何ですか? デストラクタ。

次の 2 つの選択肢があります。

  1. 通常のミューテックスをカプセル化する C++11 または boost lock_guard を使用できますが、例外の安全性を提供し、あなたのような問題を回避するように設計されています。ただし、これは、pthread の代わりに C++11 またはブースト スレッドを使用するようにアプリケーション全体を変更する必要があることを意味します。

  2. デストラクタでミューテックスを解放できます。

幸運を!

于 2012-05-12T17:08:57.580 に答える