boost::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 );
ただし、このメソッドは 1 つのスレッドにのみ影響します。すべてのスレッドが実行中で、デッドロックしていないことを確認するにはどうすればよいですか?