当 dong 求和时,openmp 的锁似乎不起作用
lock of openmp seems not to work when dong summation
我是 openMP 和多线程的新手。我需要做一些求和工作,我知道在写入共享变量时,它需要使用 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 = %d\n", 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 = %d\n", 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 = %d\n", a, b);
return 0;
}
结果是
thread_num = 8
a = 1001, b = 1002
a = 676, b = 679
我在 Win10 上 运行 这段代码。谁能解释为什么结果是错误的?
锁保护实际数据项免受同时写入。你的锁在指向该项目的对象中,所以这是没有意义的。你需要让你data
指向一个包含锁的对象。
我是 openMP 和多线程的新手。我需要做一些求和工作,我知道在写入共享变量时,它需要使用 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 = %d\n", 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 = %d\n", 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 = %d\n", a, b);
return 0;
}
结果是
thread_num = 8
a = 1001, b = 1002
a = 676, b = 679
我在 Win10 上 运行 这段代码。谁能解释为什么结果是错误的?
锁保护实际数据项免受同时写入。你的锁在指向该项目的对象中,所以这是没有意义的。你需要让你data
指向一个包含锁的对象。