2016-01-19 47 views
5

C11標準的說,對原子類型(_Atomic),前綴和後綴++--操作are atomic,因爲是化合物分配(6.5.2.4,P2):op=(6.5.16.2,P3) 。原子性簡單賦值運算符

我還沒有找到任何關於簡單作業的文章=。它也是原子嗎?

讓我們說E1,E2是int,但只有E1是用說明符_Atomic定義的。 我的假設是,這樣的:

E1 = E2; 

等同於:

atomic_store(&E1 , E2); 

據我的假設是正確的?

+2

這個_not_怎麼可能是原子的。 「設置」和「未設置」之間的狀態是什麼? –

+3

@WernerVanBelle這是從標準的角度來看。想象一下抽象機器。 – 2501

+5

@WernerVanBelle例如,在使用avr-gcc的Atmel中,當您設置一個16位變量時,首先設置高位字節,然後設置低位字節。 – Ctx

回答

3

繼此Dr Dobbs article,中的示例之後,C11中原子變量的簡單賦值爲原子

的C11標準(ISO/IEC 9899:2011),節6.2.6.1/9讀取:用原子類型的對象

加載和存儲與 memory_order_seq_cst語義完成。

除了是原子的,執行的操作與memory_order_seq_cst語義具有由所有線程(又名sequentially-consistent ordering)觀察到一個單一的排序。

沒有_Atomic類型限定符,賦值可能是非原子的。在32位機器上分配一個64位值(例如一個long long)需要兩個CPU週期。如果另一個線程讀取這兩個週期之間的值,它們將得到舊值的4個字節和新值的4個字節。