首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11内存顺序-差异?

C++11内存顺序-差异?
EN

Stack Overflow用户
提问于 2014-04-10 21:44:46
回答 1查看 232关注 0票数 5

我目前正在阅读“在行动中的并发性”,在第111页中,它给出了与std::atomic_flag相关的示例代码,以解释内存顺序是如何工作的:

代码语言:javascript
复制
f.clear(std::memory_order_release);
bool x = f.test_and_set();

但上面只写着:

在这里,对clear()的调用显式地请求释放语义清除标志,而对test_and_set()的调用使用默认内存顺序来设置标志和检索旧值。

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

代码语言:javascript
复制
memory_order_relaxed
memory_order_release
memory_order_seq_cst
memory_order_consume
memory_order_acquire
memory_order_acq_rel
EN

回答 1

Stack Overflow用户

发布于 2014-04-10 23:10:51

非正式的描述(用一袋盐):

  • SEQ_CST:代码的行为就好像它是一个简单的线程交织,只要没有数据竞争,就不会重新排序。
  • RELEASE/ACQUIRE:发行版“发布”了一个写,同一内存位置上的读取与该写同步。例如,互斥锁可以执行获取,互斥锁解锁释放。另一个例子是:

示例(用括号上的内存顺序标记的原子操作):

代码语言:javascript
复制
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处理器拆分了缓存,这意味着您可以从缓存的银行读取指针,而指向数据可能不在缓存中的其他银行。在Linux上实现的RCU中,rcu_derefence()负责在指针的读取和取消引用之间插入一个读取屏障。请注意,有一些关于完全更改使用内存顺序的规范(在名为“拱:原子返工”的邮件列表线程上)的讨论,因为对于编译器编写人员来说,这似乎是不切实际的。特别是,当前的标准允许您发布p,而*(q + (p-p))依赖于此。有些人认为这是毫无意义的。
  • 轻松:人人免费
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22999624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档