続マルチスレッドと例外処理
スレッド内で捕捉されなかった例外をどう扱うのか、いろいろ調べてみました。
- Boost.Thread
- 捨てられる
- C#、D、Java、Python
- 例外オブジェクトの文字列表現を出力する
- Ruby
- 親スレッドがjoin()で待っていれば、join()が子スレッドの例外を送出する
昨日のcopy_managerの実装だと、例外が発生したかどうか呼び出し側がチェックする必要がありました。この方法ではチェックを怠りがちで、せっかくの例外がエラーコード方式に逆戻りです。そこで、Ruby方式に似た仕組みを入れてみました。
#include <hamigaki/iostreams/copy_manager.hpp> template<class Source, class Sink> void some_func(Source& src, Sink& sink) { hamigaki::iostreams::copy_manager manager; manager.copy(src, sink); while (!manager.done()) // コピー中の例外がここで擬似再スロー { // 何かの処理 } }
今のところ、copy_manager::done()が送出する例外は、とりあえずstd::runtime_errorになっています。適当な名前を思いついたらちゃんとしたクラスに置き換えます、、、。