免鎖算法----原子變量

原子變量

完整的鎖機制對一個簡單的整數來講顯得浪費。內核提供了一種原子的整數類型,稱爲atomic_t,定義在<asm/atomic.h>。
原子變量操作是非常快的, 因爲它們在任何可能時編譯成一條單個機器指令。
以下是其接口函數:

void atomic_set(atomic_t *v, int i); /*設置原子變量 v 爲整數值 i.*/
atomic_t v = ATOMIC_INIT(0);  /*編譯時使用宏定義 ATOMIC_INIT 初始化原子值.*/

int atomic_read(atomic_t *v); /*返回 v 的當前值.*/

void atomic_add(int i, atomic_t *v);/*由 v 指向的原子變量加 i. 返回值是 void*/
void atomic_sub(int i, atomic_t *v); /*從 *v 減去 i.*/

void atomic_inc(atomic_t *v);
void atomic_dec(atomic_t *v); /*遞增或遞減一個原子變量.*/

int atomic_inc_and_test(atomic_t *v);
int atomic_dec_and_test(atomic_t *v);
int atomic_sub_and_test(int i, atomic_t *v);
/*進行一個特定的操作並且測試結果; 如果, 在操作後, 原子值是 0, 那麼返回值是真; 否則, 它是假. 注意沒有 atomic_add_and_test.*/

int atomic_add_negative(int i, atomic_t *v);
/*加整數變量 i 到 v. 如果結果是負值返回值是真, 否則爲假.*/

int atomic_add_return(int i, atomic_t *v);
int atomic_sub_return(int i, atomic_t *v);
int atomic_inc_return(atomic_t *v);
int atomic_dec_return(atomic_t *v);
/*像 atomic_add 和其類似函數, 除了它們返回原子變量的新值給調用者.*/
 

atomic_t 數據項必須通過這些函數存取。 如果把原子變量傳遞給需要整形參數的函數, 你會得到一個編譯錯誤。
只有原子變量的數目是原子的,atomic_t變量才能工作。
需要多個 atomic_t 變量的操作仍然需要某種其他種類的加鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章