OpenMP标准(<=4.0)关于
原因: 根据这篇文章,引用(此处为
atomic
的说明如下:
因此,如果我理解正确,以下简短的代码片段是非法的:
#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt
其中
expression-stmt
是一个具有以下形式之一的表达式语句:
...
如果子句是update或不存在:
x++;
...
在上述表达式中:
x
和v
(适用时)都是具有标量类型的左值表达式。
...
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
的目标,因为你总是需要一个引用或解引用的指针)?