我是 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 上運行此代碼。誰能解釋為什么結果是錯誤的?
uj5u.com熱心網友回復:
鎖保護實際資料項免受同時寫入。您的鎖定位于指向該專案的物件中,因此這是毫無意義的。你需要讓你data指向一個包含鎖的物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382667.html
