所謂原子操作,就是該操作絕不會在執行完畢前被任何其他任務或事件打斷,也就說,它的最小的執行單位,不可能有比它更小的執行單位,因此這裡 的原子實際是使用了物理學裡的物質微粒的概念。
原子操作需要硬體的支援,因此是架構相關的,其api和原子型別的定義都定義在核心原始碼樹的include/asm/atomic.h檔案中, 它們都使用組合語言實現,因為c語言並不能實現這樣的操作。
原子操作主要用於實現資源計數,很多引用計數(refcnt)就是通過原子操作實現的。原子型別定義如下:
typedef struct atomic_t;
volatile修飾字段告訴gcc不要對該型別的資料做優化處理,對它的訪問都是對記憶體的訪問,而不是對暫存器的訪問。
原子操作api包括:
atomic_read(atomic_t * v);
該函式對原子型別的變數進行原子讀操作,它返回原子型別的變數v的值。
atomic_set(atomic_t * v, int i);
該函式設定原子型別的變數v的值為i。
void atomic_add(int i, atomic_t *v);
該函式給原子型別的變數v增加值i。
atomic_sub(int i, atomic_t *v);
該函式從原子型別的變數v中減去i。
int atomic_sub_and_test(int i, atomic_t *v);
該函式從原子型別的變數v中減去i,並判斷結果是否為0,如果為0,返回真,否則返回假。
void atomic_inc(atomic_t *v);
該函式對原子型別變數v原子地增加1。
void atomic_dec(atomic_t *v);
該函式對原子型別的變數v原子地減1。
int atomic_dec_and_test(atomic_t *v);
該函式對原子型別的變數v原子地減1,並判斷結果是否為0,如果為0,返回真,否則返回假。
int atomic_inc_and_test(atomic_t *v);
該函式對原子型別的變數v原子地增加1,並判斷結果是否為0,如果為0,返回真,否則返回假。
int atomic_add_negative(int i, atomic_t *v);
該函式對原子型別的變數v原子地增加i,並判斷結果是否為負數,如果是,返回真,否則返回假。
int atomic_add_return(int i, atomic_t *v);
該函式對原子型別的變數v原子地增加i,並且返回指向v的指標。
int atomic_sub_return(int i, atomic_t *v);
該函式從原子型別的變數v中減去i,並且返回指向v的指標。
int atomic_inc_return(atomic_t * v);
該函式對原子型別的變數v原子地增加1並且返回指向v的指標。
int atomic_dec_return(atomic_t * v);
該函式對原子型別的變數v原子地減1並且返回指向v的指標。
原子操作通常用於實現資源的引用計數,在tcp/ip協議棧的ip碎片處理中,就使用了引用計數,碎片佇列結構struct ipq描述了乙個ip碎片,欄位refcnt就是引用計數器,它的型別為atomic_t,當建立ip碎片時(在函式ip_frag_create中), 使用atomic_set函式把它設定為1,當引用該ip碎片時,就使用函式atomic_inc把引用計數加1。
當不需要引用該ip碎片時,就使用函式ipq_put來釋放該ip碎片,ipq_put使用函式atomic_dec_and_test把引用 計數減1並判斷引用計數是否為0,如果是就釋放ip碎片。函式ipq_kill把ip碎片從ipq佇列中刪除,並把該刪除的ip碎片的引用計數減1(通過 使用函式atomic_dec實現)。
linux原子操作
原子操作指的是在執行過程中不會被別的 路徑所中斷的操作,下面列出原子操作相關的函式 1.void atomic set atomic t v,int i 設定原子變數的值為i 2.atomic t v atomic init 0 定義原子變數v並初始化為0 3.atomic read atomic ...
linux 原子操作
所謂原子操作,就是該操作絕不會在執行完畢前被任何其他任務或事件打斷,也就說,它的最小的執行單位,不可能有比它更小的執行單位,因此這裡的原子實際是使用了物理學裡的物質微粒的概念。原子操作需要硬體的支援,因此是架構相關的,其api和原子型別的定義都定義在核心原始碼樹的include asm atomic...
Linux 原子操作
所謂原子操作,就是該操作絕不會在執行完畢前被任何其他任務或事件打斷,也就說,它的最小的執行單位,不可能有比它更小的執行單位,因此這裡的原子實際是使用了物理學裡的物質微粒的概念。原子操作需要硬體的支援,因此是架構相關的,其api和原子型別的定義都定義在核心原始碼樹的include asm atomic...