Oracle® Solaris Studio 12.4:OpenMP API 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

4.7.2 OpenMP 锁

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