簡體   English   中英

並發非原子讀/寫是未定義的行為嗎?

[英]Is Concurrent Non-Atomic Read/Write An Undefined Behavior?

對 C++ 基本類型(多次讀取和多次寫入)的變量進行並發非原子讀取和寫入是 C++ 中的未定義行為嗎? 我不關心實際值,因為稍后我會發現是否發生了並發讀/寫,如果發生了,我會忽略當前值。 我只想知道行為是否是定義良好的 C++?

如果定義良好,如果線程 1 讀/寫x和線程 2 讀/寫y是否仍然定義良好,其中xy是以下union成員?

union {
  int x;
  double y;
};

對 C++ 基本類型(多次讀取和多次寫入)的變量進行並發非原子讀取和寫入是 C++ 中的未定義行為嗎?

是的。 標准(引自最新草案)說:

[介紹.races]

如果程序包含兩個潛在的並發沖突操作,則程序的執行包含數據競爭,其中至少一個不是原子的,並且都不在另一個之前發生,除了下面描述的信號處理程序的特殊情況。 任何此類數據競爭都會導致未定義的行為。 ...


只是想知道行為是否是定義良好的 C++?

它是未定義的。

如果線程 1 讀取/寫入 x 並且線程 2 讀取/寫入 y,其中 x 和 y 是以下聯合的成員?

這可能甚至“更多”未定義,因為不僅存在數據競爭,而且還可能讀取聯合的非活動成員的值。

盡管該標准未能定義有關多線程的大多數內容(甚至沒有定義什么是順序的,什么是未定義的),但有一點很清楚:您不應該“同時”以任何方式寫入您使用的任何變量:您必須使用互斥原語來修改有序的變量。

暫無
暫無

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

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