ASIOライブラリwhithデッドロックを検出する方法は?
-
21-08-2019 - |
質問
私はブースト:: ASIOライブラリと少し問題を抱えています。私のアプリが受信し、処理データは非同期、それがスレッドを作成し、それらのそれぞれに)(io_service.run実行します。
boost::asio::io_service io;
boost::thread_group thread_pool;
...
int cpu_cnt = get_cpu_count();
for (int i = 0; i < cpu_cnt; ++i)
{
thread_pool.create_thread( boost::bind(&run_service, &io) );
}
void run_service(boost::asio::io_service* io)
{
try
{
io->run();//make fun
}
catch(const std::exception& e)
{ //process error
}
catch(...)
{ //process error
}
}
時間は時間が経過した後、私のアプリケーションは、私のプログラムが生きているかどうかチェックするいくつかのスーパーバイザアプリケーションから(Windowsのメッセージングシステム全体で)メッセージを受信します。私のアプリケーションは、文句を言わない返信した場合、それが再起動されます。ここでのトリッキーな部分は、スレッドが実行中で、デッドロックされていないことを、確認することです。私はこのようなio_serviceするハンドラを投稿することができます:
io.post( &reply_to_supervisor );
が、この方法は、一つのスレッドだけに影響します。 どのように私は、すべてのスレッドが実行中で、デッドロックされていないことを確認することができますか?
解決
私は間違っているかもしれませんが、使用スレッドごとio_serviceはあなたの問題を解決するのでしょうか?
もう一つのアイデア:ポストcpu_cnt
時間が少しreply_to_supervisor
を使用するコールsleep()
- 素敵ではないが、しかし、動作するはずです。
他のヒント
これは停止問題でのインスタンスとして私を打つ、しかし、あなたはのように見えるので、 Windows上で、あなただけのソフトウェア・ソリューションのちょうど:: のスレッドライブラリで見たいと思うかもしれません。これは、ドラフトC ++ 0xのスレッドライブラリの実装であり、かつ組み込まれているデッドロック検出、自身のミューテックスでます。
は、最終的に、あなたはおそらく、 ASIOメーリングリストの上でこの質問をするほうが良いでしょうけれども。ライブラリの作者は非常に便利ですし、彼または他のいくつかのハードコアのASIOのユーザーのいずれかが、より良い答えを提供することができるかもしれない。
私が完了するのASIOのを待つためにループのいくつかの並べ替えは)(あなたのIO->の実行を前提としないつもりです。私はまた、あなたがこのASIO動作にタイムアウトを持っていると仮定するつもりです。チェックする汚い方法は、ステータススレッドの実行を持っており、どちらかのASIOスレッドが完了するのASIOまたはASIOイベントが掲載されていることを待っているにタイムアウトしたことを確認することです。いずれにせよ、あなたが変数のいくつかの並べ替えを設定したり、スレッドを知って扱うだろうことは、「生きている」とルーピングです。あなたのステータススレッドは、各変数は、/ハンドルいることを確認し、確認した後、それらをリセットします。
マインドあなたは、私は他の方法があると確信しているが、これは今のよう頭に浮かんだものです... =)