为什么`std :: atomic_thread_fence`工作

问题描述 投票:2回答:1

首先,我想列出我对此的一些理解,如果我错了,请指正。

  1. x86中的MFENCE可以确保完全屏障
  2. 顺序一致性可防止重新排序STORE-STORE,STORE-LOAD,LOAD-STORE和LOAD-LOAD

    根据Wikipedia

  3. [std::memory_order_seq_cst不能保证阻止STORE-LOAD重新排序。

    这是根据Alex's answer,“可能会将早期存储的负载重新排序到不同的位置”(对于x86,并且不会始终添加mfence。

    std::memory_order_seq_cst是否表示顺序一致性?根据第2/3点,对我来说似乎不正确。 std::memory_order_seq_cst仅在

    时表示顺序一致性
    1. 至少将一个显式MFENCE添加到LOADSTORE
    2. 加载(没有围栏)并锁定XCHG
    3. LOCK XADD(0)和存储(无围栏)

    否则,仍可能有重新订购。

    根据@LWimsey的评论,我在这里犯了一个错误,如果LOADSTORE均为memory_order_seq_cst,则没有重新排序。 Alex可能指出了使用非原子或非SC的情况。

  4. [std::atomic_thread_fence(memory_order_seq_cst)总是生成全屏]

    这是根据Alex's answer。所以我总是可以用asm volatile("mfence" ::: "memory")

    替换std::atomic_thread_fence(memory_order_seq_cst)

    这对我来说很奇怪,因为memory_order_seq_cst在原子函数和篱笆函数之间的用法似乎有很大不同。

现在我进入实现了std::atomic_thread_fence的MSVC 2015标准库的头文件中的此代码>

inline void _Atomic_thread_fence(memory_order _Order)
    {   /* force memory visibility and inhibit compiler reordering */
 #if defined(_M_ARM) || defined(_M_ARM64)
    if (_Order != memory_order_relaxed)
        {
        _Memory_barrier();
        }

 #else
    _Compiler_barrier();
    if (_Order == memory_order_seq_cst)
        {   /* force visibility */
        static _Uint4_t _Guard;
        _Atomic_exchange_4(&_Guard, 0, memory_order_seq_cst);
        _Compiler_barrier();
        }
 #endif
    }

所以我的主要问题是_Atomic_exchange_4(&_Guard, 0, memory_order_seq_cst);如何创建完整的屏障MFENCE,或者实际上做了什么来启用类似的机制,例如MFENCE,因为_Compiler_barrier()在这里显然不足以构成完整的内存屏障,或者该语句的工作原理与第3点类似?

首先,我想列出我对此的一些理解,如果我错了,请纠正我。 x86中的MFENCE可以确保完整的屏障顺序一致性防止对STORE-STORE进行重新排序,...

c++ c++11 concurrency atomic memory-barriers
1个回答
0
投票

只是因为将C ++栅栏实现为生成特定的汇编级栅栏,并且通常需要生成一个,这并不意味着您可以四处寻找内联asm并用C ++指令替换显式的asm栅栏!

© www.soinside.com 2019 - 2024. All rights reserved.