【问题标题】:Is gcc's atomic test and set builtin the same as an atomic fetch and store operation?gcc 的 atomic test 和 set builtin 是否与 atomic fetch 和 store 操作相同?
【发布时间】:2011-04-04 02:52:12
【问题描述】:

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

据我所知,这会以原子方式将值写入内存位置并返回该内存位置的原始值,对吗?

而且是 gcc 的 atomic builtin,

   __sync_lock_test_and_set

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

【问题讨论】:

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


    【解决方案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, ...)
    

    它们显然取自 Intel Itanium 参考手册,但 GCC 可以在任何 CPU 上实现它们(如果您在不支持的 CPU 上使用一个,则会发出警告,然后使用非原子版本)。你记下的函数实际上是一个扩展的内存屏障(或临界区):屏障由__sync_lock_test_and_set建立,由__sync_lock_release释放。

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

    【讨论】:

    • 您确定可以使用 compare_and_swap 实现 fetch_and_store 吗?
    猜你喜欢
    • 2013-01-18
    • 2012-03-22
    • 2015-11-29
    • 2010-11-12
    • 1970-01-01
    • 2023-03-27
    • 2015-11-29
    • 2017-01-12
    • 2016-06-05
    相关资源
    最近更新 更多