2011-04-04 30 views

回答

0

根據GCC info page,這確實是原子的,但它不是基本的原子獲取和存儲。

(這是從4.4手動夾緊,所以不同的區段號)

5.48內置函數用於原子存儲器訪問

(...)

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, ...) 
bool __sync_bool_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...) 
TYPE __sync_val_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...) 
__sync_synchronize (...) 
TYPE __sync_lock_test_and_set (TYPE *ptr, TYPE value, ...) 
void __sync_lock_release (TYPE *ptr, ...) 

它們顯然取自Intel Itanium參考手冊,但是GCC在它們可以使用的任何CPU上實現它們(並警告如果您在不使用CPU的CPU上使用,然後使用非ato麥克風版本)。您記下的功能實際上是一個擴展的內存屏障(或關鍵區域):屏障由__sync_lock_test_and_set確定,並由__sync_lock_release發佈。

如果你正在尋找一個基本的原子獲取和設置,它可能是__sync_val_compare_and_swap,雖然在大多數情況下,你會想使用一個更具體的版本。

+2

您確定可以通過compare_and_swap實現fetch_and_store嗎? – 2013-04-08 22:48:15