簡體   English   中英

同時讀取寫入的成功

[英]Success of write with simultaneous read

如果程序中的一個線程嘗試從另一個變量讀取而另一個線程寫入變量,則讀取的值當然是未定義的。 但是,假設只有一個作者,寫保證成功嗎? 例如:

bool myGlobalVariable = false;
void thread1() {
    myGlobalVariable = true;
}
void thread2() {
    bool x = myGlobalVariable; //x is undefined
}

在這種情況下,一旦兩個線程都完成, myGlobalVariable保證是true

我特別想知道linux上的gcc,但我有興趣知道其他操作系統和編譯器的作用,或者ARM的行為是否與x86不同。

在實踐中,沒有什么可能失敗。 但是,C ++ 11/14標准在這方面非常清楚。 以下是C ++ 14草案部分[intro.multithread]/23 (強調我的)的引用:

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

[intro.multithread]/6中定義沖突行為的地方:

如果其中一個修改內存位置(1.7)而另一個訪問或修改相同的內存位置,則兩個表達式評估會發生沖突

我無法看到在任何情況下,如果它只是一個寫而不是一個讀,這可能無法寫入該值。

對同一變量進行多線程訪問的原因很明顯,就是在操作期間是否正在修改變量時, 不會進行檢查 這不是它可能檢查然后抱怨。

因此,在單個寫入的情況下,只是一個寫入(所以沒有i++ ,這也是一個讀取),它必須成功。

當然,如果您願意,可以設計出會失敗的硬件,但我不知道任何標准架構如何失敗。

正如Anton在他的回答中指出的那樣,規范說它是未定義的行為,因此有可能編寫一個有效的C ++編譯器,故意注意這種行為並隨機化結果。 但是在實踐中沒有編譯器會這樣做。

也就是說,依靠官方未定義的行為絕不是一個好主意,所以正如jeffamaphone的評論所說,你的問題的正確答案是寫作會成功,但你仍然不應該這樣做。

暫無
暫無

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

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