当dong求和时,openmp的锁似乎不起作用



我是openMP和mutli线程的新手。我需要做一些求和工作,并且我知道在写入共享变量时,它需要使用类似omp_lock_t的锁。但当我这样做的时候,结果仍然是错误的。

代码为:

#include <omp.h>
#include <cstdio>
struct simu
{
public:
simu() : data{ nullptr }
{
omp_init_lock(&lock);
}
~simu()
{
omp_destroy_lock(&lock);
}
void calcluate()
{
omp_set_lock(&lock);
(*data) += 1;
omp_unset_lock(&lock);
}
public:
omp_lock_t lock;
int *data;
};
int main()
{
printf("thread_num = %dn", omp_get_num_procs());
const int size = 2000;
int a = 1;
int b = 2;
simu s[size];
simu *ps[size];
for (int i = 0; i < size; ++i)
{
s[i].data = (0 == i % 2) ? &a : &b;
ps[i]     = &s[i];
}
for (int k = 0; k < size; ++k)
{
ps[k]->calcluate();
}
printf("a = %d, b = %dn", a, b);
a = 1;
b = 2;
#pragma omp parallel for default(shared) num_threads(4)
for (int k = 0; k < size; ++k)
{
ps[k]->calcluate();
}
printf("a = %d, b = %dn", a, b);
return 0;
}

结果是

thread_num = 8
a = 1001, b = 1002
a = 676, b = 679

我在Win10上运行此代码。有人能解释为什么结果是错误的吗?

锁保护实际数据项不被同时写入。你的锁在指向物品的对象中,所以这是毫无意义的。您需要让data指向一个包含锁的对象。

最新更新