作爲一個業餘愛好項目,我正在用垃圾收集來創建一種編程語言。 該語言將被編譯爲(最好是可移植的)C++並支持線程。線程可以混合寫入值嗎?
現在的問題是: 支持兩個線程「同時」將不同的值寫入同一個(指針大小和對齊的)內存位置。 那麼是否有可能讓任何線程讀取兩個值之間的混合?
例如在32位平臺上:
線程1條寫道:AAAAAAAA
線程2條寫道:BBBBBBBB
將任何線程總是讀AAAAAAAA或BBBBBBBB也可以讀取AAAABBBB或其他一些兩者之間的「混合」? 我不關心訂購和最終價值。重要的是,從該位置不能讀取任何無效值。
我意識到這可能取決於平臺,C++可能不會提供任何承諾。 對於某些平臺會有保證嗎?是否需要使用內聯彙編器來實現? PS:我相信std :: atomic會做出這樣的保證,但是我認爲使用所有加載/存儲操作來處理對象引用會有很大的開銷。
如果您正在編寫以空字符結尾的字符串並且尚未附加終止字符,該怎麼辦?你可能不想混合讀寫。 – AndyG
作爲一個語言設計者,它定義了數據競賽發生時會發生的事情。你可以決定一個實現必須以某種方式處理它(限制性能),或者你可以決定底層硬件決定發生了什麼(而不是平臺獨立),或者任何事情都是可能的(很難編程在)。問我們你的語言如何在某種情況下表現得沒有意義。 – nwp
我在問C++的行爲,因爲我打算編譯爲C++。我知道C/C++有很多未定義的行爲,所以我的問題是如何在C++中實現「從不讀取無效指針」的保證。 – LaZe