c++ - 这段代码打印 x 的值在 5000 左右,但不是 10000,这是为什么呢?
问题描述
我编写的这段代码创建了 2 个线程和一个迭代 10000 次的 for 循环,但最后 x 的值接近 5000 而不是 10000,为什么会发生这种情况?
#include<unistd.h>
#include<stdio.h>
#include<sys/time.h>
#include "omp.h"
using namespace std;
int x=0;
int main(){
omp_set_num_threads(2);
#pragma omp parallel for
for(int i= 0;i<10000;i++){
x+=1;
}
printf("x is: %d\n",x);
}
解决方案
x
不是原子类型,在不同的线程中读写。(认为这int
是原子类型是一种常见的误解。)
因此,您的程序的行为是未定义的。
使用std::atomic<int> x;
是解决方法。
推荐阅读
- react-native - 世博会:无效的sdkVersion“32.0.0”
- php - 从 Sonata 中的页面获取块内容
- laravel - 如何显示单个加密记录?
- angular - 两个可观察类数组之间的映射
- swift - 在 UITableView 部分标题中锚定 UILabel
- notifications - 为什么边缘扩展通知未定义“创建”?
- azure - 部署 Azure TSI 预览时出现错误?
- c# - Windows 10 IoT 中的 ConnectionRefused
- jquery - 如何指示 jquery 执行 jquery 功能并忽略本机点击事件?
- android - 如何从 Android 向 Unity(使用 VR)发送消息?(UnityPlayer.UnitySendMessage 不起作用)