在使用OpenMP的C程序中,我想在任何线程(我不需要知道是哪个线程)满足某个条件时设置一个标志。如果标志变量被所有线程共享,并且标志被初始化为0(在多线程部分之前),并且任何线程都会将值设置为1或0(它们总是设置为相同的值),那么我是否需要“#杂注omp atomic”指令?
例如,以下代码片段:
//DataStruct is self defined data structure
function (DataStruct *data) {
int i,flag=0;
#pragma omp parallel for
for(i=0;i<data->maxval;i++) {
//Do stuff
if (/*check condition*/) {
//data->printMesage is 0 or 1, and doesn't change. It is fixed
//before calling this function
//data->printMesage is also an int variable
flag=data->printMesage;
}
}
//End of for loop. The code is running in
//single thread from here
if (flag) {
//Print message
}
}
是否有必要在"flag=data->printMesage;“之前添加”#杂注omp原子“指令?
发布于 2019-04-27 22:42:53
即使存储值小于字大小,也需要避免两个线程读取和写入相同内存位置的竞争条件。您将需要一个#pragma omp atomic write
和#pragma omp atomic read
对来避免竞争条件。因为您不能使用atomic
构造来保护if(flag) {...}
,所以必须引入一个temp变量来读取标志:
#pragma omp atomic read
tmp = flag
if (tmp) { ... }
此外,您可能需要通过使用flush
构造或者通过向atomic
构造添加seq_cst
(顺序内存一致性)或一对acquire
和release
子句来使线程的内存视图保持一致。
https://stackoverflow.com/questions/55880861
复制相似问题