【发布时间】:2014-06-16 16:07:32
【问题描述】:
OpenMP 标准 (atomic:
#pragma omp atomic [read | write | update | capture ] new-lineexpression-stmt其中
expression-stmt是一个表达式语句,其中一个 以下形式:
...
如果子句已更新或不存在:x++;
...
在上述表达式中:x和v(如适用)都是具有 标量 类型的左值表达式。
...
因此,当我正确解释时,以下短代码 sn-p 是非法的:
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++ 的“引用类型”的概念?还是大多数编译器都会编译这段代码,否则atomic 的使用会受到严重限制(基本上堆上的数据不会成为atomic 的目标,因为您总是需要引用或取消引用的指针)?
【问题讨论】:
标签: c++ openmp atomic reference-type