GCC提供的加減和邏輯原子操作

2021-07-29 23:40:57 字數 2196 閱讀 8530

在實際的程式設計中,我們不免需要對變數進行加減和邏輯操作。由於對變數的加減和邏輯操作並不是原子操作,在單執行緒程式設計中這並不會有什麼的影響;在多執行緒程式設計中這就會造成問題。

在多執行緒程式設計中,如果需要對同一變數進行訪問。那麼我們最先想到的可能是利用執行緒的同步機制(比如互斥量)製造出一片執行緒安全的區域,並在這片區域對變數進行訪問。這似乎「合情合理」,確實這種做法是正確的,它的確能確保對變數訪問的執行緒安全,但某些情況下,這種處理方式效率是低下的。

例如:在實際的專案中我們可能需要統計一整天的客戶端的連線數,當乙個客戶端連線上伺服器,我們需要對這個變數進行自增。這時候如果使用執行緒的同步機制來實現執行緒的安全,效率顯然是低下的,事實上我們可能只需要對變數進行自增,但是使用執行緒的同步機制來對變數進行保護的開銷遠遠大於自增操作。這時候我們就可以充分的利用編譯器為我們提供的一些原子操作。

gcc從4.1.2提供了__sync_*系列的built-in函式,用於提供加減和邏輯運算的原子操作。這些函式如下所示:

//返回更新前的值,類似於字尾++

type __sync_fetch_and_add (type *ptr, type value, ...)

type __sync_fetch_and_sub (type *ptr, type value, ...)

type __sync_fetch_and_or (type *ptr, type value, ...)

type __sync_fetch_and_and (type *ptr, type value, ...)

type __sync_fetch_and_xor (type *ptr, type value, ...)

type __sync_fetch_and_nand (type *ptr, type value, ...)

//返回更新後的值,類似於字首++

type __sync_add_and_fetch (type *ptr, type value, ...)

type __sync_sub_and_fetch (type *ptr, type value, ...)

type __sync_or_and_fetch (type *ptr, type value, ...)

type __sync_and_and_fetch (type *ptr, type value, ...)

type __sync_xor_and_fetch (type *ptr, type value, ...)

type __sync_nand_and_fetch (type *ptr, type value, ...)

//這兩個函式提供原子的比較和交換,如果*ptr == oldval,就將newval寫入*ptr

bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) //在相等並寫入的情況下返回true

type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...) //返回操作之前的值

type __sync_lock_test_and_set (type *ptr, type value, ...) //將*ptr設為value並返回*ptr操作之前的值

void __sync_lock_release (type *ptr, ...) //將*ptr設為0

其中type可以是1,2,4,或8位元組長度的int型別,即:

int8_t / uint8_t

int16_t / uint16_t

int32_t / uint32_t

int64_t / uint64_t

下面的例子是乙個多執行緒的原子計數器。

#include #include using namespace std;

#define thread_num 2

int g_isum = 0;

void *func(void *parg)

pthread_exit((void *)1);

}int main(void)

} for (int i = 0; i < thread_num; i++) }

cout << "g_isum = " << g_isum << endl;

return 0;

}

GCC 提供的原子操作

gcc 提供的原子操作 gcc從4.1.2提供了 sync 系列的built in函式,用於提供加減和邏輯運算的原子操作。其宣告如下 type sync fetch and add type ptr,type value,type sync fetch and sub type ptr,type v...

GCC 提供的原子操作

日期 2011 06 17 gcc從4.1.2提供了 sync 系列的built in函式,用於提供加減和邏輯運算的原子操作。其宣告如下 type sync fetch and add type ptr,type value,type sync fetch and sub type ptr,type...

GCC 提供的原子操作

gcc從4.1.2提供了 sync 系列的built in函式,用於提供加減和邏輯運算的原子操作。其宣告如下 type sync fetch and add type ptr,type value,type sync fetch and sub type ptr,type value,type sy...