[英]C++ Thread Safety: If only one thread can write to a non-atomic variable but multiple threads read from it.. can problems be encountered?
如果一個線程讀取另一個線程正在寫入的非原子原始變量,它是否保證在寫入之前或之后讀取該值,或者它可以在寫入期間以某種方式讀取一些損壞的版本?
我意識到像鏈表這樣的集合是另一回事。
不,沒有任何保證。
雖然我真的應該停在那里,因為它是一個完整的答案,但如果您認為“這怎么可能 go 錯誤”,請考慮一個對非原子變量的寫入不是原子的實現。 因此,如果您寫入0x2F
然后寫入0x30
,則另一個線程可能會在寫入之前讀取第一個半字節,然后讀取第二個半字節並獲得0x20
。
此外,假設一個非原子變量的值為零並且此代碼運行:
#define LAUNCH 1
#define DO_NOT_LAUNCH 0
if (war_has_been_declared)
non_atomic_variable = LAUNCH;
else
non_atomic_variable = DO_NOT_LAUNCH;
沒有規則禁止實現將代碼優化為:
non_atomic_variable = LAUNCH;
if (! war_has_been_declared)
non_atomic_variable = DO_NOT_LAUNCH;
這意味着即使尚未宣戰,另一個線程也可能會看到 LAUNCH 命令!
但重要的是要記住,根本沒有任何保證。 不管你是否能想到一個合理的方法,它可以 go 錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.