4

アプリにio_serviceオブジェクトが1つだけあり、スレッド化されている場合(以下のコードを参照)、非同期ハンドラーの1つが例外をスローするとどうなりますか。それはどのように伝播し、さらに重要なことに、それらを処理するための最良の方法は何ですか。

std::list< boost::shared_ptr< the_client > > clients_list;
for(int i = 0; i < n_threads; i++)
{
    clients_list.insert(boost::make_shared< the_client >( io_service, server_host, server_port ));
}

for(unsigned int i = 0; i < n_threads; i++)
{
    threads.create_thread(boost::bind(&boost::asio::io_service::run, boost::ref(io_service)));
}

for(std::list< boost::shared_ptr< the_client > >::iterator itr = clients_list.begin(); itr != clients_list.end(); ++itr)
{
    (*itr)->connect_to_server_and_run_statemachine();
}

ここでthe_client::connect_to_server_and_run_statemachine()サーバーへの接続を設定し、非同期接続処理を開始します。

私は同様のトピックに関する質問を知っていますが、それはマルチスレッドのio_serviceシナリオを考慮していません。

4

1 に答える 1

3

魔法のようなことは何も起こりません。どこかで例外をキャッチすると、catchブロックがそれを処理します。それ以外の場合、キャッチされない例外はプロセスを終了します。

あなたがそれをどのように扱うべきかはあなたが何をしたいかに依存します。例外が発生しない場合は、プロセスを終了させます。io_service::run例外を処理または処理する場合は、try/catchブロックでラップする関数を記述し、代わりにスレッドにそれを実行させます。

インテリジェンスをコードからそれほど遠くに置くのは好きではありません。私の好ましい解決策は、本当に致命的なエラーがない限り、非同期関数が例外をスローしないようにすることです。非同期関数がスローする可能性のある例外の処理方法を知っている場合は、それをキャッチする必要があります。

runただし、アプリケーションでそれが理にかなっている場合は、ラップすることは完全に許容されます。

于 2012-11-05T12:47:39.370 に答える