互斥機制之原子操作

2021-10-09 15:39:58 字數 1567 閱讀 9255

一、整型原子操作

1.設定原子變數的值

void atomic_set(atomic_t*v, int i); //設定原子變數的值為i

atomic_t v =atomic_init(0); //定義原子變數v並初始化為0

2.獲取原子變數的值

atomic_read(atomic_t *v); //返回原子變數的值

3.原子變數加/減

void atomic_add(int i, atomic_t *v); //原子變數增加i

void atomic_sub(int i,

atomic_t *v); //原子變數減少i

4.原子變數自增/自減

void atomic_inc(atomic_t *v); //原子變數增加1

void atomic_dec(atomic_t *v); //原子變數減少1

5.操作並測試

int atomic_inc_and_test(atomic_t *v);

int atomic_dec_and_test(atomic_t *v);

int atomic_sub_and_test(int i, atomic_t *v);

//上述操作對原子變數執行自增、自減和減操作後(注意沒有加)測試其是否為0,為0則返回true,否則返回false。

6.操作並返回

int atomic_add_return(int i, atomic_t *v);

int atomic_sub_return(int i, atomic_t *v);

int atomic_inc_return(atomic_t *v);

int atomic_dec_return(atomic_t *v);

//上述操作對原子變數進行加/減和自增/自減操作,並返回新的值。

二、位原子操作

1.設定位

void set_bit(nr, void *addr);

//上述操作設定addr 位址的第nr 位,所謂設定位即將位寫為1。

2.清除位

void clear_bit(nr, void *addr);

//上述操作清除addr 位址的第nr 位,所謂清除位即將位寫為0。

3.改變位

void change_bit(nr, void *addr);

//上述操作對addr 位址的第nr 位進行反置。

4.測試位

test_bit(nr, void *addr);

//上述操作返回addr 位址的第nr 位。

5.測試並操作位

int test_and_set_bit(nr, void *addr);

int test_and_clear_bit(nr, void *addr);

int test_and_change_bit(nr, void *addr);

//上述test_and_***_bit(nr, void *addr)操作等同於執行test_bit(nr, void *addr)後再執行***_bit(nr, void *addr)。

Golang 原子操作與互斥鎖

先來看乙個 package main import fmt runtime sync var counter int32 wg sync.waitgroup func main func addcounter whoami string final counter is 2 首先這個程式是起了兩個 ...

原子操作以及加鎖機制

一 原子操作 不可被中斷的乙個或一系列操作。二 處理器如何實現原子操作 32位處理器使用基於對快取加鎖或匯流排加鎖的方式來實現多處理器之間的原子操作 1 匯流排鎖 使用處理器提供乙個lock 訊號,當乙個處理器在匯流排上輸出此訊號的時候,其他處理器的請求將被阻塞,那麼該處理器可以獨佔使用共享記憶體。...

Linux核心併發機制 原子操作

很多人會問這樣的問題,linux核心中提供了各式各樣的鎖機制到底有何作用?追根到底其實是由於作業系統中存在多程序對共享資源的併發訪問,從而引起了程序間的競態。這其中包括了我們所熟知的smp系統,多核間的相互競爭資源,單cpu之間的相互競爭,中斷和程序間的相互搶占等諸多問題。所謂的原子操作,就是該操作...