在并行程序中处理错误的最佳方法是什么?


11

随着并行算法的出现,现在可能是考虑错误处理的好时机。

所以起初有错误代码。那些很烂。可以随意忽略它们,因此您可能会迟到并产生难以调试的代码。

然后是例外。这些问题一旦发生就变得不可忽视,而且大多数人(乔尔除外)更喜欢他们。

现在我们有了帮助并行代码的库。问题是,您无法像使用非并行代码那样轻松地处理并行代码中的异常。如果异步启动任务并引发异常,则没有堆栈跟踪可以展开。最好的办法是捕获它并将其注册在任务对象上(如果有)。但是,它破坏了异常的主要优势:您必须检查它们,并且可以不加任何考虑地忽略它们,而在单线程代码中,异常必然会触发适当的操作(即使这意味着终止程序)。

语言实现或库应如何支持并行代码中的错误?


2
这不应该属于stackoverflow吗?
Graviton

@Ngu Soon Hui这是主观的,它与不一定存在的功能有关,因此我认为它属于此处。
zneak 2010年

但这是关于编程的,而不是程序员。:)
bzlm

1
@bzlm常见问题解答说:“程序员-Stack Exchange适用于对软件开发的主观讨论感兴趣的专业程序员。” 因此,SO明确地阻止了主观讨论。
zneak

Answers:


2

我比较喜欢可以处理的错误的回调。而且可以使它们异步工作得很好...

但是对于无法处理的错误,真正的异常错误,我宁愿看到相关信息已保存并且程序已终止。由于通常无论如何都可以通过某种全局错误处理程序来完成此操作,因此我认为无需将异常转换成对此起作用的方法-但是更好的平台支持可用于检测关键错误并产生内存转储等。


我第二个回调。上面的想法对我来说似乎很完美。
Pax Noctis

-2

似乎您想确保该任务处理了自己的异常,然后返回使调用程序知道需要关闭该线程的内容。然后,知道其中一些线程已失败,它将具有处理所有线程的结果的逻辑。


5
“归还某物”-给谁?呼叫者已经继续前进。
Mark H

正如@sparkie所说,您不能只是这样做。即使您将调用堆栈作为协程的根,调用者也可能相距甚远。正如我提到的,异常设计,使他们停止你的程序现在。以后自己检查它会完全击败它,因为异常可能会被忽略。
zneak 2010年

@Zneak,我想当我提到异常时,我并没有使用您的(标准)定义,这只是意味着错误已被捕获。在完成任何功能之后,它必须返回到某个位置,此时可以(在该级别)处理“异常” /错误。我不确定为什么你们指的是调用程序距离较远,该函数的任何返回值都必须以某种方式处理。我意识到,如果线程的结果相互依赖地相互啮合,则效果将不尽如人意。

1
并非所有并行任务都“返回”某处。例如,您可以将一个长任务委托给一个单独的线程,同时在主线程上执行其他操作(错误地),而不必怀疑它是否正确完成了。例如,我可以编写一个映像版本软件,该软件可以从辅助线程写入文件,并在任务启动后立即从保存对话框返回。我不需要返回值,无论它是什么,都可以用于任何进一步的操作,因此,除了错误之外,没有理由检查它。
zneak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.