1. 程式人生 > >C語言賦值語句是不是原子操作?

C語言賦值語句是不是原子操作?

相關概念:

時鐘週期、匯流排週期和指令週期
1.時鐘週期:微處理器執行指令的最小時間單位,又稱T狀態。它通常與微機的主頻有關。
2.匯流排週期:CPU對儲存器或I/O埠完成一次讀/寫操作所需的時間。如8086微處理器的基本匯流排週期由四個時鐘週期T1~T4組成,80486微處理器的基本匯流排週期由T1和T2兩個時鐘週期組成。當外設速度較慢時,可插入等待週期Tw。
3.指令週期:CPU執行一條指令所需要的時間。指令週期由若干個匯流排週期組成,不同指令執行的時間不同。同一功能的指令,在定址方式不同時,所需要的時間也不同。
匯流排操作週期:微機系統各部件之間的資訊交換是通過匯流排操作週期完成的,一個匯流排週期通常分為以下四個階段。
1.匯流排請求和仲裁階段:當有多個模組提出匯流排請求時,必須由仲裁機構仲裁,確定將匯流排的使用權分配給哪個模組。
2.定址階段:取得匯流排使用權的模組,經匯流排發出本次要訪問的儲存器或I/O埠的地址和有關命令。
3.傳送資料階段:主模組(指取得匯流排控制權的模組)與其他模組之間進行資料的傳送。
4.結束階段:主模組將有關資訊從總線上撤除,主模組交出對匯流排的控制權。

CPU最小的執行單元是指令,一個指令週期可能包括多個匯流排週期。
我們可以得到:
1. 在單處理器下,一個操作只包括一個cpu指令可以保證是原子操作。如果一個操作包含多個cpu指令不是原子操作。
2. 在多處理器下,由於一個cpu指令週期可能包含多個匯流排週期,就有可能出現其他處理器在一個指令執行期間訪問了其相關的狀態。因此,多處理器下,指令執行期間還必須鎖匯流排,才能保證CPU指令的原子性

Linux atomic_set實現

mips實現  #define atomic_set(v, i)        ((v)->counter = (i))

powerpc 實現

static __inline__ void atomic_set(atomic_t *v, int i)
{
    __asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
}

總結:

原子操作和硬體實現、編譯器實現都緊密相關,因此,單純的在高階語言的層次討論原子操作,沒有太大的意義。