当 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指向一个包含锁的对象。