在OpenMP并行循环体内使用goto仅内部跳转是否正确?
OpenMP并行循环体内使用goto仅在循环体内部跳转的正确性分析
结论:这种用法是合法且正确的,只要goto的跳转范围严格限定在当前并行循环的单个迭代体内部,就不会违反OpenMP的规范。
原因说明
OpenMP的parallel for会将循环的迭代任务分配给不同线程,每个线程独立处理各自负责的若干个i值对应的代码块。每个迭代的执行上下文是线程私有的,goto仅在当前迭代内部跳转,既不会干扰其他线程的执行,也不会破坏OpenMP的并行语义。
对示例代码的分析
- 示例中的
goto LBL1仅跳转到当前i迭代内的外层循环起始处,完全在单个迭代的代码范围内,属于合法使用。 - 代码中的冗余点:
std::recursive_mutex没必要,普通std::mutex即可满足需求,递归锁会带来额外性能开销。- 对
write_arr[i]的修改不需要加锁:每个write_arr[i]仅由处理该i的线程访问和修改,不存在线程竞争,直接赋值即可,去掉锁能大幅提升并行效率。
内容的提问来源于stack exchange,提问作者HappyBullying
相关产品推荐
相关产品推荐

