atomic inc 原子操作

2021-09-02 16:59:00 字數 1971 閱讀 9232

atomic_inc(&v)對變數v用鎖定匯流排的單指令進行不可分解的"原子"級增量操作,避免v的值由於中斷或多處理器同時操作造成不確定狀態。

原子操作

所謂原子操作,就是該操作絕不會在執行完畢前被任何其他任務或事件打斷,也就說,它的最小的執行單位,不可能有比它更小的執行單位,因此這裡的原子實際是使用了物理學裡的物質微粒的概念。

原子操作需要硬體的支援,因此是架構相關的,其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實現)。

原子性,原子操作

舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...

原子變數與原子操作

1.原子操作的速度要快於臨界區,event,互斥量,如果多個執行緒同時寫乙個變數時,最方便的就是原子操作。原子操作函式,解決多執行緒安全 2.原子變數也是為了解決執行緒衝突問題,如果兩個執行緒同時訪問同乙個變數,乙個執行緒改變了這個變數,另乙個執行緒就會出現一些bug。3.release和debug...

c 原子操作 賦值 c 原子操作

這個型別可以在兩個狀態間切換 設定set flag true 和清除clear flag false 必須被atomic flag init初始化此時flag為clear狀態,初始化標準為是清除狀態。當你的標誌物件已初始化,那麼你只能做三件事情 銷毀,清除或設定 查詢之前的值 這些事情對應的函式分別...