从 OpenMP 3.0 开始,锁为任务所有,而不再由线程所有。某个任务获取锁之后,该任务就会拥有该锁,同一任务必须在任务完成前释放锁。但是,critical 构造仍然保留了基于线程的互斥机制。
由于锁为任务所有,因此使用锁时应格外小心。下例符合 OpenMP 2.5 规范,因为在并行区域中释放锁 lck 的线程与在该程序顺序部分中获取锁的线程相同。并行区域的主线程与初始线程相同。但是,该示例不符合最近的规范,因为释放锁 lck 的任务区域不是获取锁的任务区域。
示例 4-7 OpenMP 3.0 之前的锁应用#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); }