gcc的原子操作

2021-09-13 16:27:51 字數 3210 閱讀 9793

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

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, ...)

第一組返回更新前的值,第二組返回更新後的值。type可以是1,2,4或8位元組長度的int型別。

後面的可擴充套件引數(…)用來指出哪些變數需要memory barrier,因為目前gcc實現的是full barrier,所以可以略掉這個引數。

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寫入ptr,

第乙個函式在相等並寫入的情況下返回true.

第二個函式在返回操作之前的值。

//發出乙個full barrier.

__sync_synchronize (...)

// 將*ptr設為value並返回*ptr操作之前的值。

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

//將*ptr置0

void __sync_lock_release (type *ptr, ...)

gcc實現了c++11之後(gcc版本要大於4.7),上面的__sync系列操作就不被推薦使用了,而基於c++11的新原子操作介面使用__atomic作為字首。與__sync系列相比,__atomic系列函式最大的不同就是,需要指定記憶體序。

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

type __atomic_add_fetch(type *ptr, type val, int memorder)

type __atomic_sub_fetch(type *ptr, type val, int memorder)

type __atomic_and_fetch(type *ptr, type val, int memorder)

type __atomic_xor_fetch(type *ptr, type val, int memorder)

type __atomic_or_fetch(type *ptr, type val, int memorder)

type __atomic_nand_fetch(type *ptr, type val, int memorder)

type __atomic_fetch_add(type *ptr, type val, int memorder)

type __atomic_fetch_sub(type *ptr, type val, int memorder)

type __atomic_fetch_and(type *ptr, type val, int memorder)

type __atomic_fetch_xor(type *ptr, type val, int memorder)

type __atomic_fetch_or(type *ptr, type val, int memorder)

type __atomic_fetch_nand(type *ptr, type val, int memorder)

type __atomic_load_n (type *ptr,int memorder);

void__atomic_store_n (type *ptr, type val,int memorder);

type __atomic_exchange_n (type *ptr, type val,int memorder);

bool__atomic_compare_exchange_n (type *ptr, type *expected, type desired,bool weak,

int success_memorder,int failure_memorder);

函式的用途從函式名可知,上面的帶_n的字尾版本如果去掉_n就是不用提供memorder的seq_cst版本。

bool __atomic_test_and_set (void *ptr, int memorder)

void __atomic_clear (bool *ptr, int memorder)

void __atomic_thread_fence (int memorder)

bool __atomic_always_lock_free (size_t size, void *ptr)

bool __atomic_is_lock_free (size_t size, void *ptr)

前面幾個函式,意思比較明確。後面的兩個函式,是判斷系統上對於某個長度的物件是否會產生lock-free的原子操作。

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...

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...