gpt4 book ai didi

c++ - 为什么在 CAS 循环失败时首选 std::memory_order_relaxed ?

转载 作者:行者123 更新时间:2023-12-02 02:13:38 25 4
gpt4 key购买 nike

说到实现CAS Loop使用 this link 中的 std::atomic、cppreference给出了以下push示例:

template<typename T>
class stack
{
std::atomic<node<T>*> head;
public:
void push(const T& data)
{
node<T>* new_node = new node<T>(data);
new_node->next = head.load(std::memory_order_relaxed);

while(!head.compare_exchange_weak(new_node->next, new_node,
std::memory_order_release,
std::memory_order_relaxed /* Eh? */));
}
};

现在,我不明白为什么 std::memory_order_relaxed 用于失败情况,因为据我所知,compare_exchange_weak(对于 -strong 但为了方便起见,我将使用弱版本)是失败时的加载操作,这意味着它使用 std::memory_order_release 从另一个线程中成功的 CAS 操作加载,因此它应该使用 std::memory_order_acquire同步......?

while(!head.compare_exchange_weak(new_node->next, new_node,
std::memory_order_release,
std::memory_order_acquire /* There you go! */));

假设,如果“宽松负载”获得旧值之一,最终一次又一次失败,并在循环中停留额外的时间怎么办?

下面这张粗糙的图片是我的大脑卡住的地方。

enter image description here

Shouldn't a store from T2 be visible at T1? (by having synchronized-with relation with each other)

总结一下我的问题,

  • 失败时为什么不使用 std::memory_order_acquire 而不是 std::memory_order_relaxed
  • 是什么让 std::memory_order_relaxed 足够?
  • 失败时 std::memory_order_relaxed 是否意味着(可能)更多循环?
  • 同样,失败时的 std::memory_order_acquire 是否意味着(可能)更少的循环? (除了性能的缺点之外)

最佳答案

更严格的内存顺序用于防止数据争用,并且不应提高已经正确的程序的性能。在您提供的示例中替换 memory_order_relaxedmemory_order_acquire不会解决任何数据竞争,只会降低性能。

为什么没有数据竞争?因为 while 循环仅适用于单个原子,无论使用的内存顺序如何,该原子始终是无数据争用的。

为什么memory_order_release那么在成功的情况下使用呢?示例中未示出,但假设头部的访问使用 memory_order_acquire ,例如:

T* stack::top() {
auto h = head.load(std::memory_order_acquire);
return h ? &h->value() : nullptr;
}

这个释放-获取序列在释放新头和另一个线程获取它之间创建同步关系。

<表类=“s-表”><标题>线程A线程B <正文>
st.push(42);
if (auto value = st.top()) {
assert(*value == 42);
}

在上面的示例中,如果没有 release-acquire(如果使用 memory_order_relaxed ),断言可能会失败,因为线程 B 可能会看到未完全初始化的 nodehead已经指向(编译器甚至可以在 node 中的设置 head 下面重新排序 push() 构造函数调用)。换句话说,将会出现数据竞争。

关于c++ - 为什么在 CAS 循环失败时首选 std::memory_order_relaxed ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58635264/

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