gpt4 book ai didi

C++11 内存排序——区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:21 25 4
gpt4 key购买 nike

我目前正在阅读《Concurrency in Action》,在第 111 页上,它给出了与 std::atomic_flag 相关的示例代码,以解释内存排序的工作原理:

f.clear(std::memory_order_release);
bool x = f.test_and_set();

但它只说:

Here, the call to clear()explicitly requests that the flag is cleared with release semantics, while the call to test_and_set() uses the default memory ordering for setting the flag and retrieving the old value.

他们实际上并没有解释区别是什么。有人可以提供这些内存排序如何工作的一般概述吗?所以不只是我上面提到的那个,我相信还有几个:

memory_order_relaxed
memory_order_release
memory_order_seq_cst
memory_order_consume
memory_order_acquire
memory_order_acq_rel

最佳答案

非正式表征(与一袋盐一起接受):

  • SEQ_CST:只要不存在数据竞争,代码的行为就好像它是简单的线程交错,不会观察到重新排序。
  • RELEASE/ACQUIRE:一个版本“发布”一个写入,并且在同一内存位置上的读取与该写入同步。例如,互斥锁可能执行ACQUIRE,而互斥锁解锁RELEASE。另一个例子:

示例(原子操作在括号中标有它们的内存顺序):

t1:                                   t2:
data = foo while not data_valid; (ACQUIRE)
data_valid = true; (RELEASE) bar = data;
  • ACQ_REL:为原子 RMW(读取-修改-写入)操作执行获取和释放。请注意,您可以指定对成功的 RMW 使用 ACQ_REL,如果 RMW 操作失败,则使用另一个内存顺序。
  • RELEASE/CONSUME:您发布一个指向结构的指针,读取“消耗”该发布,并且可以访问指向的数据。某些 Alpha 处理器具有拆分缓存,这意味着您可以从缓存的一个 bank 读取一个指针,而指向的数据可能不在该缓存的其他 bank 上。在 Linux 上实现的 RCU 中,rcu_derefence() 负责在读取指针和取消引用之间的 Alpha 上插入读取屏障。请注意,已经有人讨论过完全改变消耗内存顺序的规范(在一个名为 "arch: atomic rework" 的邮件列表线程上),因为这对编译器编写者来说似乎不切实际。特别是,当前标准允许您发布 p,而 *(q + (p-p)) 依赖于此。有些人认为这根本没有意义。
  • 轻松所有人免费。

关于C++11 内存排序——区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999624/

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