gpt4 book ai didi

c++ - atomic_thread_fence(memory_order_release) 与使用 memory_order_acq_rel 有区别吗?

转载 作者:太空狗 更新时间:2023-10-29 20:34:03 29 4
gpt4 key购买 nike

cppreference.com 提供this note about std::atomic_thread_fence (强调我的):

atomic_thread_fence imposes stronger synchronization constraints than an atomic store operation with the same std::memory_order.

While an atomic store-release operation prevents all preceding writes from moving past the store-release, an atomic_thread_fence with memory_order_release ordering prevents all preceding writes from moving past all subsequent stores.

我将此注释理解为 std::atomic_thread_fence(std::memory_order_release) 不是单向的,如存储发布。这是一个双向栅栏,可防止栅栏任一侧上的商店通过栅栏另一侧的商店重新订购。

如果我理解正确的话,这个栅栏似乎提供了与 atomic_thread_fence(memory_order_acq_rel) 相同的保证。它是一个“向上”的栅栏,也是一个“向下”的栅栏。

std::atomic_thread_fence(std::memory_order_release)std::atomic_thread_fence(std::memory_order_acq_rel) 之间是否存在功能差异?还是区别仅仅是美学上的,以记录代码的目的?

最佳答案

独立栅栏比具有相同排序约束的原子操作强加了排序,但这不会改变强制执行排序的方向。

Bot 一个原子释放操作和一个独立的释放栅栏是单向的,但是原子操作对自身进行排序,而原子栅栏则对其他商店进行排序。

例如,具有释放语义的原子操作:

std::atomic<int> sync{0};

// memory operations A

sync.store(1, std::memory_order_release);

// store B

这保证了 A(加载和存储)的任何内存操作部分都不能(明显地)用原子存储本身重新排序。但它是单向的,没有排序规则适用于在原子操作之后排序的内存操作;因此,仍然可以使用 A 中的任何内存操作对存储 B 进行重新排序。

独立的发布围栏改变了这种行为:

// memory operations A

std::atomic_thread_fence(std::memory_order_release);

// load X

sync.store(1, std::memory_order_relaxed);

// stores B

这保证了 A 中的任何内存操作都不能(明显地)用释放栅栏之后排序的 任何 存储重新排序。在这里,B 的存储不能再用 A 中的任何内存操作重新排序,因此,释放栅栏比原子释放操作更强大。但它也是单向的,因为来自 X 的加载仍然可以通过 A 中的任何内存操作重新排序。

区别很微妙,通常原子释放操作优于独立的释放栅栏。

standalone acquire fence 的规则是相似的,除了它强制执行相反方向的排序并在负载上运行:

// loads B

sync.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire);

// memory operations A

在独立获取栅栏之前排序的任何加载都不能对 A 中的内存操作进行重新排序。

具有 std::memory_order_acq_rel 排序的独立栅栏结合了获取和释放栅栏的逻辑。

// memory operations A
// load A

std::atomic_thread_fence(std::memory_order_acq_rel);

// store B
//memory operations B

但是,一旦您意识到 A 中的商店仍然可以通过 B 中的负载重新订购,这就会变得非常棘手。应该避免使用 Acq/rel 栅栏,以支持常规的原子操作,或者更好的互斥锁。

关于c++ - atomic_thread_fence(memory_order_release) 与使用 memory_order_acq_rel 有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315186/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com