【问题标题】:OpenMP atomic on a reference type?引用类型上的 OpenMP 原子?
【发布时间】:2014-06-16 16:07:32
【问题描述】:

OpenMP 标准 (atomic:

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

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

因此,当我正确解释时,以下短代码 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&amp; reference)不是标量类型。但是标准明确规定它必须是一,才能使用atomic

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

我的问题是:我是否误解了标准,或者 C++ 的“引用类型”的概念?还是大多数编译器都会编译这段代码,否则atomic 的使用会受到严重限制(基本上堆上的数据不会成为atomic 的目标,因为您总是需要引用或取消引用的指针)?

【问题讨论】:

    标签: c++ openmp atomic reference-type


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 2014-03-02
      • 2015-02-05
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2021-03-09
      • 2017-05-09
      相关资源
      最近更新 更多