3
顯然,原子操作可以確保不同的線程不會破壞值。但是,在使用共享內存的過程中,這仍然是真的嗎?即使這些進程恰巧被操作系統安排在不同的內核上運行?或跨越不同的CPU?跨進程的原子操作是否與跨線程一樣工作?
編輯:另外,如果它不安全,即使在像Linux這樣的操作系統上,從調度程序的角度來看進程和線程是相同的,它是不是安全的?
顯然,原子操作可以確保不同的線程不會破壞值。但是,在使用共享內存的過程中,這仍然是真的嗎?即使這些進程恰巧被操作系統安排在不同的內核上運行?或跨越不同的CPU?跨進程的原子操作是否與跨線程一樣工作?
編輯:另外,如果它不安全,即使在像Linux這樣的操作系統上,從調度程序的角度來看進程和線程是相同的,它是不是安全的?
tl; dr:閱讀原子操作文檔中的細則。有些將按設計原子化,但可能會超過某些變量類型。但是,一般來說,原子操作會像在線程之間那樣維護不同進程之間的契約。
原子操作確實只能確保在兩個實體同時調用時不會出現不一致狀態。例如,通過在相同的整數兩個不同的線程或進程被稱爲原子增量將總是表現像這樣:
其中A和B表示第一和第二螺紋或進行呼叫的進程。
可導致由於競爭條件不一致或大致瘋狂結果的非原子操作時,不完整的寫入地址空間,等等。例如,可以很容易地看到:
注意競爭條件爲實體B比賽過去A,並首先完成表達式。
現在想象一下,如果x是一個64位double,並且不能保證有原子分配。在這種情況下,你可以很容易看到這樣的內容:
這些非原子分配是您需要診斷的最可怕的併發錯誤。