OpenMP原子在引用类型上?

时间:2014-06-16 16:07:33

标签: c++ openmp atomic reference-type

OpenMP标准(< = 4.0)说atomic

  

#pragma omp atomic [read | write | update | capture ] new-line
   expression-stmt

     

其中expression-stmt是一个带有其中一个的表达式语句   以下表格:
  ...
  如果条款更新或不存在:
  x++;
  ...
  在前面的表达式中:
   xv(如果适用)都是带有标量类型的l值表达式。
  ...

因此,当我正确解释这一点时,以下短代码片段是非法的:

int main()
{
  int myCounter = 0;
  int& reference = myCounter;

  #pragma omp parallel for
  for (int i = 0; i < 100; ++i)
  {
    #pragma omp atomic
    reference++; // Increment through reference.
  }
  return 0;
}

原因:根据this post,引用(此处int& reference)不是标量类型。但是标准明确指出它必须是一个,才能使用atomic

代码用g ++编译,没有任何警告(-Wall -Wextra)。

我的问题是:我是否误解了标准或C ++&#34;参考类型&#34;的概念?或者大多数编译器都会编译此代码,因为否则atomic的使用受到严重限制(基本上堆上的数据可能不是atomic的目标,因为您总是需要引用或解除引用的指针) ?

1 个答案:

答案 0 :(得分:5)

引用类型不是标量类型。但是,这个事实与你的问题无关。重要的事实是,计算对标量类型的引用的表达式是具有标量类型的左值。具体而言,变量 reference的类型为int&,但表达式 reference的类型为int和值类别左值。所以,是的,你的程序符合要求。