首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >并发标志集需要一个#杂注omp原子吗?

并发标志集需要一个#杂注omp原子吗?
EN

Stack Overflow用户
提问于 2019-04-27 21:07:42
回答 1查看 471关注 0票数 1

在使用OpenMP的C程序中,我想在任何线程(我不需要知道是哪个线程)满足某个条件时设置一个标志。如果标志变量被所有线程共享,并且标志被初始化为0(在多线程部分之前),并且任何线程都会将值设置为1或0(它们总是设置为相同的值),那么我是否需要“#杂注omp atomic”指令?

例如,以下代码片段:

代码语言:javascript
复制
//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原子“指令?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-27 22:42:53

即使存储值小于字大小,也需要避免两个线程读取和写入相同内存位置的竞争条件。您将需要一个#pragma omp atomic write#pragma omp atomic read对来避免竞争条件。因为您不能使用atomic构造来保护if(flag) {...},所以必须引入一个temp变量来读取标志:

代码语言:javascript
复制
#pragma omp atomic read
tmp = flag
if (tmp) { ... }

此外,您可能需要通过使用flush构造或者通过向atomic构造添加seq_cst (顺序内存一致性)或一对acquirerelease子句来使线程的内存视图保持一致。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55880861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档