背景:
サードパーティのハードウェアとクローズド ソース ドライバーに依存するアプリケーションがあります。現在、ドライバーにはバグがあり、デバイスがランダムな時間後に応答を停止します。これは、ドライバー内の明らかなデッドロックが原因であり、24 時間 365 日常時オンの非常に目に見える環境にあるアプリケーションの適切な機能を中断します。
私が見つけたのは、GDB をプロセスにアタッチし、すぐにプロセスから GDB をデタッチすると、デバイスが機能を再開することです。これは、ドライバー自体にスレッド ロックの問題があることを示す最初の兆候でした。デッドロックにつながるある種の競合状態があります。GDB をアタッチすると、明らかにスレッドの再シャッフルが発生し、おそらくスレッドが待機状態から抜け出し、スレッドの状態が再評価され、デッドロックが解消されました。
質問:
私の質問は次のとおりです。アプリケーションがプログラム内のすべてのスレッドをトリガーして待機状態を中断するためのクリーンな待機はありますか? (少なくとも私の実装では)確実に機能することの 1 つは、SIGSTOP を送信し、その後すぐに別のプロセス (つまり、bash から) から SIGCONT を送信することです。
kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile`
これにより、プロセス内で偽のウェイクアップがトリガーされ、すべてが元に戻ります。
プロセス内のすべてのスレッドの誤ったウェイクアップをトリガーするインテリジェントな方法があることを願っています。考えpthread_cond_broadcast(...)
てみてください。ただし、待機中の実際の状態変数にアクセスする必要はありません。
kill
これは可能ですか、それとも私の唯一のアプローチのようなプログラムに依存していますか?