2016-08-11 3 views
1

私は少し混乱していますが、私の質問は簡単です。スレッド間の例外。どのくらいのstd :: exception_ptrと同期が必要ですか?

私はたくさんのスレッドを持っています。他のスレッドから送信されたメインスレッドのすべての例外を処理することで、エラー処理を集中化したいと考えています。

  1. 私はグローバル共有exception_ptrを使用して、すべてのスレッド内のすべてのcatch句でstd::current_exception()を使用していますか?または、別のスレッドに対して異なるexcpetion_ptrオブジェクトを持つ必要がありますか?私はすべての例外を維持したいと思います。
  2. current_exceptionexc_ptr変数に割り当てられると、メインスレッドからexc_ptrにアクセスすると、メインスレッドからの読み込みを同期させる必要がありますか?
+0

はい、もちろん「t」が必要です。あなたはそれなしで単語 "スレッド"を入力することはできません。 – Casey

+0

はい、私はstd :: async/std :: futureが好きですが、適切な同期が必要です – JVApen

+0

さまざまなスレッドでさまざまな例外があり、それらをすべて別のスレッドで処理したいのですか?それはどのように役立ち/維持可能/実現可能ですか? – nwp

答えて

1

サブスレッドによって処理されない例外のみメインスレッドに伝播したいとします。つまり、従属スレッドの最上位のハンドラでexception_ptrを使用するだけです。

グローバルコンテナ(たとえば、プロデューサ/コンシューマキュー)がexception_ptrであることが最も簡単なアプローチだと思います。各トップレベルスレッド例外ハンドラは、その例外をキューにプッシュして終了します。メインハンドラはキューから例外を引き出し、再スローします。もちろん、キューの適切な同期が必要です。 exceoption_ptrをキューから取り出した後は、同期させる必要はありません。スレッドを作成したスレッドはそれ以上はそれに触れることはないためです。

また、単一のグローバルexception_ptr(容量1のキューに相当し、ほとんど同じ方法で同期させること)が可能である必要があります。

関連する問題