我在 MCS 锁的描述中遇到了一个原子“获取和存储”指令。
据我所知,这以原子方式将一个值写入内存位置并返回该内存位置的原始值,对吗?
并且是 gcc 的 atomic builtin,
__sync_lock_test_and_set
与原子获取和存储相同吗?
我在 MCS 锁的描述中遇到了一个原子“获取和存储”指令。
据我所知,这以原子方式将一个值写入内存位置并返回该内存位置的原始值,对吗?
并且是 gcc 的 atomic builtin,
__sync_lock_test_and_set
与原子获取和存储相同吗?
根据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 上使用一个,则会发出警告,然后使用非原子版本)。您提到的功能实际上是一个扩展的内存屏障(或临界区):屏障由 建立,并由__sync_lock_test_and_set
释放__sync_lock_release
。
如果您正在寻找基本的原子获取和设置,__sync_val_compare_and_swap
尽管在大多数情况下您可能希望使用更具体的版本之一。