我很困惑這個問題 - 讀/切換布爾值是否線程安全。C#和線程安全的bool
// case one, nothing
private bool v1;
public bool V1 { get { return v1; } set { v1 = value; } }
// case two, with Interlocked on set
private int v2;
public int V2 { get { return v2; } set { Interlocked.Exchange(ref v2, value); } }
// case three, with lock on set
private object fieldLock = new object();
private bool v3;
public bool V3 { get { return v3; } set { lock (fieldLock) v3 = value; } }
他們都是線程安全的嗎?
編輯
從我讀(click)布爾的原子並不保證它是線程安全的。請問volatile
型的幫助?
這些都不是線程安全的。調用getter的線程將始終讀取陳舊值。它有多陳舊取決於處理器和優化器。從幾納秒到無窮大。吸氣劑也需要同步。或者你可以使用ManualResetEvent/Slim。 – 2015-04-02 12:26:51
@ Ksv3n * Assignement總是一個原子操作*假,32位程序的「長」(64位)分配不是原子的。 – xanatos 2015-04-02 13:00:24
@HansPassant一個getter可以讀取一箇舊值,這是可以理解的。但是,它怎麼會持續到無窮?使用鎖將使它讀取*正確*值 - 重讀它,就好像它是不穩定的?我不認爲它是這樣工作的,我對你說的話感到困惑。我認爲一旦沒有人在寫東西,吸氣劑就會正常工作。 – 2015-04-02 13:40:58