数据的共享和私有化
1. 引言
在并行区域内,若多个线程共同访问同一个存储单元,并且至少会有一个线程更新数据单元中的内容时,会发生数据竞争。本节的数据共享和私有化对数据竞争做一个初步探讨,后续会涉及同步、互斥的内容。
2. 并行区域内的变量的共享和私有
除了以下三种情况外,并行区域中的所有变量都是共享的:
> 并行区域中定义的变量
> 多个线程用来完成循环的循环变量
> private、firstprivate、lastprivate、reduction修饰的变量
例如,
3. 共享与私有变量声明的方法
private(val1, val2, ...) 并行区域中变量val是私有的,即每个线程拥有该变量的一个copy
firstprivate(val1, val2, ...) 与private不同,每个线程在开始的时候都会对该变量进行一次初始化
lastprivate(val1, val2, ...) 与private不同,并发执行的最后一次循环的私有变量将会copy到val
shared(val1, val2, ...) 声明val是共享的
4. private示例
如果使用private,无论该变量在并行区域外是否初始化