task 指令采用以下数据属性子句,这些子句可定义任务的数据环境:
default (private | firstprivate | shared | none)
private (list)
firstprivate (list)
shared (list)
在任务内对 shared 子句中列出的变量的所有引用是指在 task 指令之前一看便知的同名变量。
对于每个 private 和 firstprivate 变量,都会创建一个新存储,并且对 task 构造词法范围内的原始变量的所有引用都会被对新存储的引用所替换。遇到任务时,将会使用原始变量的值初始化 firstprivate 变量。
OpenMP 版本 3.0 规范(第 2.9.1 节)介绍了如何确定在并行、任务和工作共享区域中所引用变量的数据共享属性。
构造中引用的变量的数据共享属性可以是以下属性之一:预先确定、显示确定或隐式确定。具有显式确定数据共享属性的变量是那些在给定构造中引用,并在构造的数据共享属性子句中列出的变量。具有隐式确定数据共享属性的变量是那些在给定构造中引用、不具有预先确定数据共享属性,并且不在构造的数据共享属性子句中列出的变量。
有关如何隐式确定变量的数据共享属性的规则可能并不总是很直观。为避免意外,建议程序员使用数据共享属性子句显式确定任务构造中引用的所有变量的作用域,而不是依赖 OpenMP 隐式作用域规则。