OpenMP 3.0 指定,锁不再归线程所有,而是归任务所有。一旦获取了锁,当前任务就会拥有该锁,同一任务必须先释放锁才能完成任务。
另一方面,critical 构造仍保留采用基于线程的互斥机制。
使用锁时,需要格外小心锁拥有权的变化。以下程序(在 OpenMP 规范版本 3.0 中作为示例 A.43.1c 出现)符合 OpenMP 2.5,因为在并行区域中释放锁 lck 的线程与在该程序顺序部分中获取锁的线程为同一线程(并行区域的主线程与初始线程相同)。但是,该程序不符合 OpenMP 3.0,因为释放锁 lck 的任务区域与获取锁的任务区域不同。
#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
int main()
{
int x;
omp_lock_t lck;
omp_init_lock (&lck);
omp_set_lock (&lck);
x = 0;
#pragma omp parallel shared (x)
{
#pragma omp master
{
x = x + 1;
omp_unset_lock (&lck);
}
}
omp_destroy_lock (&lck);
}
|