DSP 之原子與高性能設計(一) 用戶態/內核態 原子原語

cc從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, ...)
這一系列函數完成對ptr所指向的內存地址的對應操做,並返回操做以前的值。

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所指向的內存地址的對應操做,並返回操做以後的值

bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)

這兩個函數完成對變量的原子比較和交換。即若是ptr所指向的內存地址存放的值與oldval相同的話,
則將其用newval的值替換。
返回bool類型的函數返回比較的結果,相同爲true,不一樣爲false;返回type的函數返回的是ptr指向地址交換前存放的值。html

type能夠是1,2,4或8字節長度的int類型,即:linux

int8_t / uint8_t函數

int16_t / uint16_tfetch

int32_t / uint32_tui

int64_t / uint64_tspa

這兩組函數的區別在於第一組返回更新前的值,第二組返回更新後的值。code

後面的可擴展參數(...)用來指出哪些變量須要memory barrier,由於目前gcc實現的是full barrier(相似於linux kernel 中的mb(),表示這個操做以前的全部內存操做不會被重排序到這個操做以後),因此能夠略掉這個參數。htm


還有兩個函數:

type __sync_lock_test_and_set (type *ptr, type value, ...)
   將*ptr設爲value並返回*ptr操做以前的值。

void __sync_lock_release (type *ptr, ...)
     將*ptr置0
排序

https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html#Atomic-Builtins內存

相關文章
相關標籤/搜索