【发布时间】:2014-07-03 16:41:47
【问题描述】:
您能否告诉我我用来处理用例的方法是否无效,如果是,正确的处理方法是什么:
task<int> do_work(int param)
{
// runs some work on a separate thread, returns task with result or throws exception on failure
}
void foo()
{
try
{
auto result_1 = do_work(10000);
auto result_2 = do_work(20000);
// do some extra work
process(result_1.get(), result_2.get());
}
catch (...)
{
// logs the failure details
}
}
所以代码尝试并行执行两个作业,然后处理结果。如果其中一项作业引发异常,则调用task::get 将重新引发异常。如果两个任务都抛出异常,则会发生此问题。在这种情况下,对task::get 的第一次调用将导致堆栈展开,因此将调用第二个task 的析构函数,并反过来导致在堆栈展开期间重新抛出一个异常,从而导致“中止”调用。
在我遇到问题之前,这种方法对我来说似乎完全有效。
【问题讨论】:
-
为什么(第二个)任务从其析构函数中抛出?
-
@StackedCrooked... 这实际上是主要问题。要么我弄错了,要么
task析构函数真的重新抛出了do_work函数中捕获的异常。 -
@Cyber... 我看不出它是如何相关的。你能解释一下吗?