1. 程式人生 > >linux系統原子操作

linux系統原子操作

帶來 incr 利用 隱患 初始 pre ack 簡單 title

一、概念

原子操作提供了指令原子執行,中間沒有中斷。就像原子被認為是不可分割顆粒一樣,原子操作(atomic operation)是不可分割的操作。
c語言中一個變量的自加1操作,看起來很簡單,好像只需要一條指令而不被打斷。但這個操作實現起來,CPU的執行是有一個過程的,分為讀取到寄存器,寄存器數學運算,回寫到內存。這個實際情況,會給我們程序編寫時帶來隱患,舉例來說明。

Thread 1 Thread 2
---------------------------------------------
get i (7)  get i (7)

increment i (7->8)

---   increment i (7->8)

write back i (8) ----

--- write back i (8)

可以看到,不通的進程對同一個變量,自加1操作了兩次,但是得到的結果,卻是只自加1了一次,這種結果不是我們預先想要的。如果有一種方法,讓對這個變量的讀取、計算、回寫整個過程,不被別的進程所打斷,那麽情況會好很多:

Thread 1         Thread 2
--------------------------------------------------------
get, increment, and store i(7->8) ---

---          get, increment, and store i(8->9)

或者:

Thread 1         Thread 2
--------------------------------------------------------
---           get, increment, and store i(7->8)
get, increment, and store i(8->9) ---

這種操作就是原子操作,利用一種獨占內存的實現策略,這當然需要CPU的指令集提供這樣的鎖內存單元操作。

二、使用方法

1、定義一個原子變量,並初始化

atomic_t v = ATOMIC_INIT(0);

2、原子變量自減1

atomic_dec(&v);

3、原子變量自加1

atomic_inc(&v);

4、讀取原子變量的值

atomic_read(&v);

5、原子變量自減1,並與0比較,如果為0則返回true,否則返回false

atomic_dec_and_test(&v);

參考資料:linux中原子操作實現方式

linux系統原子操作