我在MCS锁的描述中遇到了原子“获取和存储”指令。
从我收集的内容中,这会原子地将值写入内存位置并返回该内存位置的原始值,这是正确的吗?
是gcc的原子内置,
__sync_lock_test_and_set
与原子获取和存储相同吗?
答案 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
,尽管在大多数情况下你会想要使用一个更具体的版本。