OpenMP对引用类型的原子操作?

5
OpenMP标准(<=4.0)关于atomic的说明如下:

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

其中expression-stmt是一个具有以下形式之一的表达式语句:
...
如果子句是update或不存在:
x++;
...
在上述表达式中:
xv(适用时)都是具有标量类型的左值表达式。
...

因此,如果我理解正确,以下简短的代码片段是非法的:
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;
}

原因: 根据这篇文章,引用(此处为int& reference)并不是标量类型。但是标准明确规定它必须是标量类型,以便使用atomic

该代码在g++下编译通过,没有任何警告(-Wall -Wextra)。

我的问题是:我是否误解了标准或C++的“引用类型”概念?还是大多数编译器都可以编译此代码,因为否则就无法使用atomic(基本上堆上的任何数据都不能成为atomic的目标,因为你总是需要一个引用或解引用的指针)?

1个回答

5

引用类型不是标量类型。但是这个事实与您的问题无关。重要的事实是,评估标量类型的引用的表达式是具有标量类型的lvalue。具体而言,reference变量的类型为int&,但reference表达式的类型为int,值类别为lvalue。所以,是的,您的程序符合规范。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接