1

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

4

3 に答える 3

2

私は間違っているかもしれませんが、スレッドごとに io_service を使用すると問題が解決しますか?

別のアイデア:少し使用するpost cpu_cnttimes呼び出し- 良くないが、動作するはずですreply_to_supervisorsleep()

于 2009-01-06T14:51:12.433 に答える
1

これはHalting Problemの例だと思いますが、Windows を使用しているように見えるので、Just Software Solution のjust::threadライブラリを参照してください。ドラフト C++0x スレッド ライブラリの実装であり、独自のミューテックスにデッドロック検出機能が組み込まれています。

最終的には、 asio メーリング リストでこの質問をしたほうがよいでしょう。ライブラリの作成者は非常に役に立ちます。彼または他の筋金入りの asio ユーザーのいずれかが、そこでより良い回答を提供できる可能性があります。

于 2009-01-05T15:38:41.233 に答える
0

私はあなたの io->run() がある種のループを実行して asio が完了するのを待つと仮定します。また、この asio 操作にタイムアウトがあると仮定します。チェックする汚い方法は、ステータス スレッドを実行し、asio スレッドが asio の完了を待ってタイムアウトしたか、asio イベントがポストされたかをチェックすることです。いずれにせよ、スレッドが「生きていて」ループしていることを知るために、ある種の変数またはハンドルを設定します。ステータススレッドは、各変数/ハンドルをチェックし、チェック後にそれらをリセットします。

他にも方法はあると思いますが、今思いついたのはこんな感じです(=_=)

于 2008-12-10T17:23:19.787 に答える