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中原子操作實現方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM