原子變數操作是一種在執行過程中不會被打斷的操作,它是linux核心提供的一種簡單的同步機制。原子操作需要硬體的支撐,是架構相關的。
原子操作包括原子整型操作和原子位操作。
linux核心提供了乙個原子整型變數,其定義在include/asm/atomic.h檔案中,該變數的定義為:
typedef struct
atomic_t;
atomic_t 型別的變數只能通過linux核心中定義的專用函式來進行操作,不能直接對其進行操作,否則會導致編譯錯誤。
atomic_t變數初始化:#define atomic_init(i)
例如:atomic_t count = atomic_init(0);
atomic_t變數值設定:#define atomic_set(v, i) (((v)->counter) = i)
例如:atomic_set(count, 1);
atomic_t變數值讀取:#define atomic_read(v) ((v)->counter)
例如:atomic_read(count);
atomic_t變數加減:
實現將i加到原子變數v的成員counter中。
staic inline void atomic_add(int i, volatile atomic_t *v)
實現原子變數v的成員counter減去i。
staic inline void atomic_sub(int i, volatile atomic_t *v)
atomic_t變數自加與自減:
實現原子變數v的成員counter加1。
staic inline void atomic_inc(volatile atomic_t *v)
實現原子變數v的成員counter減1。
staic inline void atomic_dec(volatile atomic_t *v)
atomic_t變數自加與自減測試:
staic inline void atomic_inc_and_test(volatile atomic_t *v)
實現原子變數v的成員counter加1,若counter為0,返回真,否則返回假。
staic inline void atomic_dec_and_test(volatile atomic_t *v)
實現原子變數v的成員counter減1,若counter為0,返回真,否則返回假。
原子位操作是對變數的每一位單獨進行操作的,它與原子整型操作不同的是,原子位操作不需要專門定義乙個特有型別的變數,只需要乙個普通的變數即可。
置位操作:將addr指向的變數的第nr位置為1
static inline void set_bit(int nr, volatile unsigned long *addr);
清零操作:將addr指向的變數的第nr位置為0
static inline void clear_bit(int nr, volatile unsigned long *addr);
取反操作:將addr指向的變數的第nr位取反
static inline void change_bit(int nr, volatile unsigned long *addr);
測試置位操作:將addr指向的變數的第nr位置為1,並且返回沒有修改之前的值
static inline int test_and_set_bit(int nr, volatile unsigned long *addr);
測試清零操作:將addr指向的變數的第nr位置為0,並且返回沒有修改之前的值
static inline int test_and_clear_bit(int nr, volatile unsigned long *addr);
測試取反操作:將addr指向的變數的第nr位取反,並且返回沒有修改之前的值
static inline int test_and_change_bit(int nr, volatile unsigned long *addr);
原子操作是一種不可以被打斷的操作,它要麼執行完畢,要麼不執行,是實現併發控制的基石。 原子操作編寫簡單,但是只能做計數操作。
原子變數與原子操作
1.原子操作的速度要快於臨界區,event,互斥量,如果多個執行緒同時寫乙個變數時,最方便的就是原子操作。原子操作函式,解決多執行緒安全 2.原子變數也是為了解決執行緒衝突問題,如果兩個執行緒同時訪問同乙個變數,乙個執行緒改變了這個變數,另乙個執行緒就會出現一些bug。3.release和debug...
原子變數的操作
原子操作,顧名思義,就是說像原子一樣不可再細分。乙個操作是原子操作,意思就是說這個操作是以原子的方式被執行,要一口氣執行完,執行過程不能夠被os的其他行為打斷,是乙個整體的過程,在其執行過程中,os的其它行為是插不進來的。原子整數操作的使用 常見的用途是計數器,因為計數器是乙個很簡單的操作,所以無需...
java併發之原子性
詳見 url 1 原子性操作 不能被執行緒排程機制中斷的操作 對原子性變數的賦值和返回操作通常都是原子性的 原子性可以用於除了long和double之外的所有基本型別上的簡單操作 當做不可分的原子 但是jvm將64位的 long 和double變數 讀取和寫入當成是兩個分離的32位 操作來執行。2 ...