linux系統原子操作
一、概念
原子操作提供了指令原子執行,中間沒有中斷。就像原子被認為是不可分割顆粒一樣,原子操作(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系統原子操作