我最近尝试在 Visual Studio 中尝试使用 OpenMP 来学习如何对我的程序进行多线程处理。
如果我尝试串行执行此代码:
int totalSum = 0;
for(int x=0; x < 100; x++)
{
for(int y=0; y < 100; y++)
{
totalSum = totalSum + x + y;
}
}
我最终得到的是totalSum = 990000
当我尝试通过以下方式仅添加 OpenMP 功能时:
#pragma omp parallel for
for(int x=0; x < 100; x++)
{
for(int y=0; y < 100; y++)
{
totalSum = totalSum + x + y;
}
}
我最终得到totalSum = 491293或 596865 或 638260 等...
显然正在发生的事情是竞争条件似乎正在发生,并且取决于哪个线程首先访问 totalSum,最终答案会有所不同。
我做错了什么?x 和 y 被正确定义为私有变量(因为它们是在并行区域内创建的)。
与串行执行程序相比,我可以做些什么来确保在对程序进行多线程处理时得到相同的答案?