[英]OpenMP atomic on a reference type?
OpenMP標准(<= 4.0)談到了atomic
:
#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt
其中
expression-stmt
是具有以下形式之一的表達式語句:
...
如果子句是更新的或不存在的:
x++;
...
在前面的表達式中:
x
和v
(如適用)都是標量類型的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.