0

Boost Threads を使用して同時実行性を提供する C++ アプリケーションがあります。基本的なサンプルは次のとおりです。

processingThreadGroup->create_thread(boost::bind(process, clientSideSocket, this));

ここで、processingThreadGroup はブーストのスレッド プールへの共有ポインターであり、process は呼び出す必要がある関数です。clientSideSocket と this は、プロセス関数に渡す必要があるパラメーターです。

エラーが検出された場合、プロセス関数内でカスタム例外をスローします。プロセス関数は、データをリモート サーバーに送信します。だから私の質問は、このエラーをコールスタックに伝播する方法は? クリーンアップ後にシステムをシャットダウンしたい。以下を試しました:

try {
    processingThreadGroup->create_thread(boost::bind(process, clientSideSocket, this));
} catch (CustomException& exception) {
    //code to handle the error
}

しかし、うまくいきませんでした。これを適切に行う方法について何か考えはありますか?

ありがとう!

4

1 に答える 1

1

戻り値と例外を伝播するには、futures を使用する必要があります。これを行う簡単な方法は次のとおりです。

// R is the return type of process, may be void if you don't care about it
boost::packaged_task< R > task( boost::bind(process, clientSideSocket, this) );
boost::unique_future< R > future( task.get_future() );

processingThreadGroup->create_thread(task);

future.get();

これには、覚えておかなければならない落とし穴がいくつかあります。まず、 の寿命はの非同期実行taskを延長する必要があります。次に、が終了するまでブロックし、正常に終了した場合はその値を返し、例外がスローされた場合は例外を伝播します。、 、 、などの状態を確認するために、あらゆる種類の関数を使用できます。processget()taskfuturehas_value()has_exception()is_ready()

于 2013-01-08T04:43:29.623 に答える