GCC數值原子操作API原理及應用

2021-10-25 18:35:42 字數 1812 閱讀 4217

c/c++中數值操作,如自加(n++)自減(n–-)及賦值(n=2)操作都不是原子操作,如果是多執行緒程式需要使用全域性計數器,程式就需要使用鎖或者互斥量,對於較高併發的程式,會造成一定的效能瓶頸。

1.概要

為了提高賦值操作的效率,gcc提供了一組api,通過彙編級別的**來保證賦值類操作的原子性,相對於涉及到作業系統系統呼叫和應用層同步的鎖和互斥量,這組api的效率要高很多。

2.n++

type __sync_fetch_and_add(type *ptr, type value, ...); // m+n

type __sync_fetch_and_sub(type *ptr, type value, ...); // m-n

type __sync_fetch_and_or(type *ptr, type value, ...); // m|n

type __sync_fetch_and_and(type *ptr, type value, ...); // m&n

type __sync_fetch_and_xor(type *ptr, type value, ...); // m^n

type __sync_fetch_and_nand(type *ptr, type value, ...); // (~m)&n

/* 對應的偽** */

// nand

3.++n

type __sync_add_and_fetch(type *ptr, type value, ...); // m+n

type __sync_sub_and_fetch(type *ptr, type value, ...); // m-n

type __sync_or_and_fetch(type *ptr, type value, ...); // m|n

type __sync_and_and_fetch(type *ptr, type value, ...); // m&n

type __sync_xor_and_fetch(type *ptr, type value, ...); // m^n

type __sync_nand_and_fetch(type *ptr, type value, ...); // (~m)&n

/* 對應的偽** */

// nand

4.cas

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

type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...);

/* 對應的偽** */

else }

return oldval; }

1.test.c

例子不是併發的程式,只是演示各api的使用引數和返回。由於是gcc內建api,所以並不需要任何標頭檔案。

#include int main()
(1)gcc atomic-builtins doc

(2)cas(compare-and-swap)

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的原子操作

提供加減和邏輯運算的原子操作 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...

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