併發控制之原子變數操作

2021-09-01 15:00:09 字數 2275 閱讀 4153

原子變數操作是一種在執行過程中不會被打斷的操作,它是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 ...