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); } |