所謂原子操作,就是該操作絕不會在執行完畢前被任何其他任務或事件打斷,也就說,它的最小的執行單位,不可能有比它更小的執行單位,因此這裡的原子實際是使用了物理學裡的物質微粒的概念。
原子操作需要硬體的支援,因此是架構相關的,其api和原子型別的定義都定義在核心原始碼樹的include/asm/atomic.h檔案中,它們都使用組合語言實現,因為c語言並不能實現這樣的操作。
原子操作主要用於實現資源計數,很多引用計數(refcnt)就是通過原子操作實現的。原子型別定義如下:
typedef struct
atomic_t;
volatile修飾字段告訴gcc不要對該型別的資料做優化處理,對它的訪問都是對記憶體的訪問,而不是對暫存器的訪問。
原子操作api包括:
該函式對原子型別的變數進行原子讀操作,它返回原子型別的變數v的值。
atomic_read(atomic_t * v);
該函式設定原子型別的變數v的值為i。
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,並判斷結果是否為0,如果為0,返回真,否則返回假。
int atomic_sub_and_test(int i, atomic_t *v);
該函式對原子型別變數v原子地增加1。
void atomic_inc(atomic_t *v);
該函式對原子型別的變數v原子地減1。
void atomic_dec(atomic_t *v);
該函式對原子型別的變數v原子地減1,並判斷結果是否為0,如果為0,返回真,否則返回假。
int atomic_dec_and_test(atomic_t *v);
該函式對原子型別的變數v原子地增加1,並判斷結果是否為0,如果為0,返回真,否則返回假。
int atomic_inc_and_test(atomic_t *v);
該函式對原子型別的變數v原子地增加i,並判斷結果是否為負數,如果是,返回真,否則返回假。
int atomic_add_negative(int i, atomic_t *v);
該函式對原子型別的變數v原子地增加i,並且返回指向v的指標。
int atomic_add_return(int i, atomic_t *v);
該函式從原子型別的變數v中減去i,並且返回指向v的指標。
int atomic_sub_return(int i, atomic_t *v);
該函式對原子型別的變數v原子地增加1並且返回指向v的指標。
int atomic_inc_return(atomic_t * v);
該函式對原子型別的變數v原子地減1並且返回指向v的指標。
int atomic_dec_return(atomic_t * 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實現
原子操作 atomic t
1.atomic t 定義及其原因 核心定義了atomic t 資料型別,作為對 整數計數器的原子操作的基礎。cpp view plain copy typedef struct atomic t 這裡引入了乙個特殊的資料型別,而不是直接使用int型別,原因如下 a.讓原子操作函式只接收 atomi...
原子操作 atomic t
1.atomic t 定義及其原因 核心定義了atomic t 資料型別,作為對 整數計數器的原子操作的基礎。cpp view plain copy typedef struct atomic t 這裡引入了乙個特殊的資料型別,而不是直接使用int型別,原因如下 a.讓原子操作函式只接收 atomi...
mysql相關操作 mysql 相關操作
1 登入 mysql u root p 2 檢視當前有的資料庫 show databases 3 建立資料庫 create database 資料庫名 4 操作 使用 資料庫 use 資料庫名 5 檢視有哪些表 show tables 6 建立表 create table 表名 7 刪除表 drop...