簡體   English   中英

引用類型上的OpenMP原子?

[英]OpenMP atomic on a 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;
}

原因:根據這篇文章 ,引用(此處為int& reference )不是標量類型。 但是該標准明確指出,為了使用atomic ,它必須是一個。

該代碼使用g ++編譯,沒有任何警告( -Wall -Wextra )。

我的問題是:我是否誤解了標准或C ++“引用類型”的概念? 還是大多數編譯器都編譯該代碼,否則atomic的使用會受到嚴格限制(基本上,堆上的任何數據都不會成為atomic的目標,因為您始終需要引用或取消引用的指針)?

引用類型不是標量類型。 但是,此事實與您的問題無關。 一個重要的事實是,計算結果為標量類型的引用的表達式與標量類型的左值。 具體來說, 變量 reference類型為int&表達式 reference類型為int ,值類別為lvalue。 是的,您的程序符合要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM