並列プログラムでエラーを処理する最良の方法は何でしょうか?


11

並列アルゴリズムがドアをノックしているので、エラー処理について考える良い機会かもしれません。

そのため、最初はエラーコードがありました。吸いました。それらを無視するのは自由だったので、遅れて失敗してデバッグしにくいコードを生成することができました。

その後、例外が発生しました。それらは一度発生すると無視できなくなり、ほとんどの人(Joelを除く)は彼らを好むようになりました。

そして今、並列コードを支援するライブラリが手に入りました。問題は、非並列コードの場合ほど簡単に並列コードの例外を処理できないことです。タスクを非同期で起動し、例外をスローした場合、そのタスクを過ぎてアンワインドするスタックトレースはありません。できるのは、そのようなオブジェクトがある場合、それをキャプチャしてタスクオブジェクトに登録することです。ただし、例外の主な強みは無効になります:それらを確認する必要があり、追加の労力なしで無視できますが、シングルスレッドコードでは例外は適切なアクションを必ずトリガーします(プログラムを終了することを意味する場合でも)。

言語実装またはライブラリは、並列コードのエラーをどのようにサポートする必要がありますか?


2
これはstackoverflowに属していませんか?
グラビトン

@Ngu Soon Hui主観的であり、必ずしも存在しない機能に関するものなので、ここに属していると思います。
zneak

しかし、それはプログラマではなく、プログラミングに関するものです。:)
bzlm

1
@bzlm FAQは、「プログラマー-Stack Exchangeは、ソフトウェア開発に関する主観的な議論に興味のあるエキスパートプログラマー向けです」と述べています。そして、SOは、主観的な議論を明確に落胆させます。
zneak

回答:


2

処理できるエラーのコールバックが好きです。そして、それらは非同期でうまく動作するようにすることができます...

しかし、処理できないエラー、本当に例外的なエラーについては、関連する情報が保存され、プログラムが終了することを望みます。これは通常、何らかのグローバルエラーハンドラーを介して行われるため、例外をこのために機能するものに変える必要はありませんが、重大なエラーを検出し、メモリダンプなどを生成するためのプラットフォームサポートが優れていると便利です。


2回目のコールバック。上記のアイデアは私にはかなり完璧に思えます。
パックスノクティス

-2

タスクがそれ自体の例外を処理したことを確認し、スレッドをシャットダウンする必要があることを呼び出し側プログラムに知らせる何かを返すようにしたいようです。その場合、すべてのスレッドの結果を処理するロジックがあり、それらのスレッドの一部が失敗したことがわかります。


5
「何かを返す」-誰に?発信者はすでに移動しています。
マークH

@sparkieが言ったように、あなたはそれをすることはできません。コールスタックをコルーチンのルートとして保持している場合でも、呼び出し元はおそらく遠く離れているでしょう。私が述べたように、彼らはあなたを停止するので、例外が設計されたプログラムを。例外が気付かれない可能性があるため、後で自分でチェックすると完全に無効になります。
-zneak

@Zneak、私があなたの(標準)定義を使用していなかった例外について言及したとき、私はただエラーがキャッチされたことを意味したと思います。関数が終了したら、どこかに戻る必要があります。その時点で、「例外」/エラーを処理することができます(そのレベルで)。呼び出し元のプログラムが遠く離れていると言っている理由がわかりません。関数からの戻り値は何らかの方法で処理する必要があります。スレッドの結果が互いに依存して噛み合っている場合、これはほぼ同様に機能しないことがわかります。

1
すべての並列タスクがどこかに「戻る」わけではありません。たとえば、メインスレッドで何か他のことをしながら、長いタスクを別のスレッドに(間違って)委任することができます。たとえば、セカンダリスレッドからファイルに書き込むイメージエディションソフトウェアを作成し、タスクが開始されるとすぐに保存ダイアログから戻ることができます。それ以降の操作には戻り値は必要ありませんので、エラーを除いて、チェックする理由はありません。
zneak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.