簡體   English   中英

在這些條件下設置可變原子

[英]Is Setting a Variable Atomic in THESE conditions

在這種情況下,我有一個狀態變量。 int state =(2,1,0)和一個無限循環:

ret = BoolCompareAndSwap(state, 1, 2)
if (ret) {
    // Change something ...
    state = 0;
}

這個狀態設置是原子的嗎? 假設設置變量,您必須:

  1. 從內存中取出
  2. 變更價值
  3. 設定新值

如果有其他線程來比較該變量,那么它將是原子的,因為直到將其重新設置在內存中,實際值才會改變,對嗎?

嚴格來說,如果C編譯器按位編寫狀態,則它們仍然符合標准。 寫入前幾位后,其他一些線程可以讀取任何類型的垃圾。
大多數編譯器都不做這種事情(可能是較舊的4位處理器甚至更窄的編譯器除外……),因為這會降低性能。

而且,在實際中更相關的是,如果有任何其他線程向狀態寫入(而不是僅讀取),則如果您不保護所描述的代碼不受競爭條件的影響,則該寫入的值可能會丟失。

附帶說明,所描述的狀態更改(讀取,修改,寫入)絕不是原子的。 但是,當這種非原子性很脆弱時,這個問題是正確的,這就是我上面試圖回答的問題。

更籠統地說,考慮並發訪問的所有可能組合是一種有效的保護機制。 但是,它在許多方面都非常昂貴(設計工作,測試工作,維護期間的風險...)。
僅當這些成本總計小於預期的節省(可能是性能)時,才可以這樣做,而不是使用適當的保護機制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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