例外安全

マルチスレッドで例外安全ってものすごく難しくないですか。

検索エンジンで、とりあえずひたすら他のノードにコネクションを張ってみる、という処理があるのだけど、コネクションを張り終わるかエラーになるまで待っていたら意味がないので、メインの検索スレッドとは別のスレッドで実行させている。

別スレッドにはメインスレッドが持っている自動変数へのリファレンスをいくつか渡している。キューとか。

で、その別のスレッドがコネクションを張ろうと頑張っている間に、既にコネクションを張り終わったノードからデータを持ってくる。

このときに例外が発生したらどうなるかと。
メインスレッドは自分のブロックを抜ける前に別スレッドを全部回収しないと、別スレッドに渡したリファレンスが無効になってしまう。Segmentation Fault一直線。



解決案は3つかな。

1. 別スレッドにリファレンスではなくshared_ptrを渡す

2. 別スレッドごとにcondition(とmutex)を渡して、例外をキャッチしたらconditionを全部waitする

3. 別スレッドを立てたときに+1、別スレッドが完了したときに-1するカウンタを作って、例外をキャッチしたらカウンタが0になるまで待つ


うーむ…性能的には1か2が良いのかな。

2の場合、別スレッドがconditionにnotifyするのはメインスレッドにデータを渡した後で良い & メインスレッドがconditionをwaitするのは例外が発生したときだけで、発生した場合でもキャッチして呼び出し元に伝播した後にwaitすれば良い ということで、condition(とmutex)の生成以外にはほとんど性能に影響しないと思う。


1は、メインスレッドが落ちようが別スレッドのshared_ptrは無効にならないから、心おきなく落ちようという方針。
…いや、よく考えたらデータを入れるバッファまではshared_ptrにできないじゃないかと…