OpenMP代码预期出现数据竞争但运行结果始终正确,是什么原因?
问题核心原因
你写的OpenMP编译制导指令存在拼写错误:#pragma omp paralle for 中的 paralle 少了一个字母 l,正确写法应为 #pragma omp parallel for。
因为拼写不符合OpenMP的指令规范,编译器会直接忽略这条无效指令,整个循环最终以单线程串行方式执行,自然不会出现多线程同时修改变量a的竞争场景,所以你每次运行都能得到正确结果,并不是巧合。
验证方法
你可以将指令的拼写修正后重新编译运行:
// 修正后的代码片段 #pragma omp parallel for for (int i = 0; i < 10000000; i++) { a = a + 1; }
此时程序会按照预期启动多线程执行循环,大概率会得到小于10000000的错误结果,符合你最初预期的数据竞争现象,这时你就需要加上reduction(+:a)子句来保证结果正确。
额外补充说明
如果你修正拼写后仍然得到正确结果,也可能是你的环境默认OpenMP线程数配置为1,你可以通过设置环境变量OMP_NUM_THREADS手动指定线程数,比如指定为4线程再运行:
$ export OMP_NUM_THREADS=4 $ ./a.out
此时基本就能复现数据竞争导致的错误结果。
内容的提问来源于stack exchange,提问作者Chun-Ye Lu
相关产品推荐
相关产品推荐

