gcc的原子测试和内置设置是否与原子获取和存储操作相同?

时间:2011-04-04 02:52:12

标签: gcc atomic built-in test-and-set

我在MCS锁的描述中遇到了原子“获取和存储”指令。

从我收集的内容中,这会原子地将值写入内存位置并返回该内存位置的原始值,这是正确的吗?

是gcc的原子内置,

   __sync_lock_test_and_set

与原子获取和存储相同吗?

1 个答案:

答案 0 :(得分:1)

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

它们显然是从英特尔安腾参考手册中获取的,但是GCC会在任何CPU上实现它们(如果在没有使用CPU的情况下使用它,则会发出警告,然后使用非原子版本)。您注意到的功能实际上是扩展内存屏障(或关键区域):屏障由__sync_lock_test_and_set建立,由__sync_lock_release释放。

如果你正在寻找一个基本的原子获取和设置,它可能是__sync_val_compare_and_swap,尽管在大多数情况下你会想要使用一个更具体的版本。