task 指令采用以下数据属性子句,这些子句可定义任务的数据环境:
default (private | firstprivate | shared | none)
private (list)
firstprivate (list)
shared (list)
在任务内对 shared 子句中列出的变量的所有引用是指在 task 指令之前一看便知的同名变量。
对于每个 private 和 firstprivate 变量,都会创建一个新存储,并且对 task 构造词法范围内的原始变量的所有引用都会被对新存储的引用所替换。遇到任务时,将会使用原始变量的值初始化 firstprivate 变量。
对于未在 task 构造的数据属性子句中列出以及未根据 OpenMP 规则预先确定的变量的数据共享属性,将按如下所述隐式确定:
(a) 在 task 构造中,如果不存在 default 子句,则被确定为在所有封闭构造(一直到并包括最深层封闭并行构造)中共享的变量为 shared。
(b) 在 task 构造中,如果不存在 default 子句,则其数据共享属性不根据规则 (a) 确定的变量为 firstprivate。
由此可见:
(a) 如果 task 构造在词法上包括在 parallel 构造中,则在所有作用域(包括 task 构造)中共享的变量在生成的任务中仍保持共享状态。否则,变量将被隐式确定为 firstprivate。
(b) 如果 task 构造是孤立的,则变量将被隐式确定为 firstprivate。