2013年5月19日日曜日

マルチスレッディングと例外再送出とSIGINT、C++11風味

前回のポスト「SIGINT, SIGTERMでも美しく止まるC++アプリケーション」に、C++11風味のマルチスレッディングモデル(std::future)と例外再送出(std::rethrow_exception, std::current_exception)を加えてやや実用性を向上したサンプルにしてみました。

このサンプルを実行した際の流れは、

  1. std::asyncによりスレッド(T)が起動しメインスレッド(M)ではstd::future(F)を得る。
  2. (T)の実行中にstd::runtime_error例外(E)がthrowされる。
  3. (E)は(T)内のcatch(...)で捕捉され、
    1. std::cerrにメッセージを表示し、
    2. raiseによりSIGINTシグナルを送出し、
    3. std::current_exceptionにより現在の例外へのstd::exception_ptr(PE)を取得し、
    4. std::rethrow_exceptionにより(PE)を再送出。
  4. (M)はboost::asio::signal_setによりSIGINTまたはSIGTERMを待っている。
  5. (M)は(F)に対しgetを処理し、(T)からの例外を受け送出する。
  6. (M)のcatch(const std::exception& e)が例外を捕捉し、
    1. std::cerrにメッセージをe.what()を含めて表示し、
    2. -1でプロセスを抜ける。

となります。

これを翻訳して実行すると、
exception on an async thread, raise SIGINT.
SIGINT
caught an std::exception, what: answer is 42.
なる結果が得られます。

0 件のコメント:

コメントを投稿