1. 程式人生 > >原子操作函式原型

原子操作函式原型

 原子操作僅執行一次,在執行過程中不會中斷也不會休眠;是最小的執行單元;鑑於原子操作這些特性,可以利用它來解決競態問題。

 往後其他同步機制都是在原子操作的基礎上進行擴充套件的。
 原子操作有整型原子操作、64位原子操作以及位原子操作。

1 整型原子操作
(Atomic Integer Operations)
 要使用原子操作,需要定義一個原子變數,然後使用核心提供的介面對其進行原子操作。
 整型原子變數結構如下

  1. #include <linux/type.h>
  2. typedef struct {
  3.     int
     counter;
  4. } atomic_t;
  可以看出整型原子變數實質上是一個32位整型變數。
 整型原子變數操作介面,其實現方式與具體的架構有關。
  1. #include <asm/atomic.h>
  2. ATOMIC_INIT(int i)                           // 定義原子變數時,將其值賦為i
  3. int atomic_read(atomic_t *v)                 // 讀v的值
  4. void atomic_set(atomic_t *v, int i)          // 設定v的值為i
  5. void atomic_add(int i, atomic *
    v)            // v的值增加i
  6. void atomic_sub(int i, atomic *v)            // v的值減少i
  7. void atomic_inc(atomic *v)                   // v的值加1
  8. void atomic_dec(atomic *v)                   // v的值減1
  9. int atomic_sub_and_test(int i, atomic_t *v)  // v的值減少i,且結果為0時返回true
  10. int atomic_add_negative(int i, atomic_t *v)  // v的值增加i,且結果為負數時返回true
  11. int atomic_add_return(int i, atomic_t *v)    // v的值增加i,且返回結果
  12. int atomic_sub_return(int i, atomic_t *v)    // v的值減少i,且返回結果
  13. int atomic_inc_return(atomic_t *v)           // v的值加1,且返回結果
  14. int atomic_dec_return(atomic_t *v)           // v的值減1,且返回結果
  15. int atomic_dec_and_test(atomic_t *v)         // v的值減1,且結果為0時返回true
  16. int atomic_inc_and_test(atomic_t *v)         // v的值加1,且結果為0時返回true

2 64位原子操作 (64-Bit Atomic Operations)
 64位原子變數結構
  1. typedef struct {
  2.     u64 __aligned(8) counter;
  3. } atomic64_t;
  64位原子變數操作介面與整型變數操作介面類似,只要將整型變數介面名稱的"atomic"改成"atomic64"即可。

3 位原子操作 (Atomic Bitwise Operations)
 位原子操作介面
  1. #include <asm/bitops.h>
  2. void set_bit(int nr, void *addr)           // 將addr第nr位置1
  3. void clear_bit(int nr, void *addr)         // 將addr第nr位置0
  4. void change_bit(int nr, void *addr)        // 將addr第nr位值取反
  5. int test_and_set_bit(int nr, void *addr)   // 將addr第nr位置1,並將該位之前值返回
  6. int test_and_clear_bit(int nr, void *addr) // 將addr第nr位置0,並將該位之前值返回
  7. int test_and_change_bit(int nr, void *addr)// 將addr第nr位取反,並將該位之前值返回
  8. int test_bit(int nr, void *addr)           // 將addr第nr位的值返回