gpt4 book ai didi

c++ - 在 Openmp 区域内抛出 std::runtime_error 会使程序崩溃

转载 作者:行者123 更新时间:2023-11-28 02:02:49 25 4
gpt4 key购买 nike

我正在尝试加速大型程序的特定部分,异常处理是在高层完成的,最初的代码看起来像

for(....)
{
...
if(...)
{
throw std:: runtime_error("Terminated by user")
}
}

现在我把它改成了类似的东西

#pragma omp parallel for ...
for(....)
{
...
if(...)
{
throw std:: runtime_error("Terminated by user")
}
}

现在,如果终止被触发,程序就会崩溃,我希望这里的异常处理能够以一种优雅的方式完成,而无需更改更高级别的内容?

最佳答案

OpenMP specification强制某些线程抛出的异常必须由同一线程在同一 parallel 区域内处理(第 2.5 节,第 49 页):

A throw executed inside a parallel region must cause execution to resume within the same parallel region, and the same thread that threw the exception must catch it.

像 GCC 这样的编译器通过使用类似于这样的包罗万象的构造来包装并行区域的代码来强制执行此要求:

try
{
...
}
catch
{
terminate();
}

因此,任何到达 parallel 区域末尾但未被捕获的异常都将导致程序中止。

该规则实际上更严格,因为它也适用于 OpenMP 构造,例如 forcriticalsingle 等。这样的构造必须在同一个构造中并被抛出它的线程捕获。在您的情况下,是 for 构造导致终止,因为在 parallel 区域的隐式 catch-all 处理程序之前到达其隐式 catch-all 处理程序。

关于c++ - 在 Openmp 区域内抛出 std::runtime_error 会使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38737531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com