簡體   English   中英

C++ 線程安全:如果只有一個線程可以寫入非原子變量但多個線程從中讀取..會遇到問題嗎?

[英]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.

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