OpenMP - 同步机制“锁”
OpenMP 中的锁(lock)
是一种同步机制,用于保护共享资源,以防止多个线程同时访问或修改它,从而避免竞态条件。锁允许线程在访问临界区之前获取锁,并在退出临界区时释放锁。这样可以确保在任何给定时间只有一个线程能够访问临界区,从而保证了数据的一致性。
简单锁
最基本的锁,只能被一个线程锁定。当一个线程锁定了简单锁时,其他线程必须等待锁的释放才能继续执行。
#include <iostream>
#include <omp.h>
using namespace std;
int main(int argc, char* argv[]){
omp_lock_t lock;
omp_init_lock(&lock);
int s = 0;
#pragma omp parallel num_threads(800)
{
omp_set_lock(&lock);
s++;
omp_unset_lock(&lock);
}
omp_destroy_lock(&lock);
cout << "s = " << s << endl;
return 0;
}
lock
s = 800 // 加锁
s = 763 // 不加锁
嵌套锁
嵌套锁允许同一个线程多次获取同一个锁,而不会发生死锁。
omp_nest_lock_t nestLock;
omp_init_nest_lock(&nestLock);
omp_set_nest_lock(&nestLock);
// ...
omp_unset_nest_lock(&nestLock);
omp_destroy_nest_lock(&nestLock);
。。。