首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11比较和交换获取/释放语义

C++11比较和交换获取/释放语义
EN

Stack Overflow用户
提问于 2012-08-02 00:26:21
回答 1查看 2.1K关注 0票数 2

让我们假设我有以下代码(玩具示例):

代码语言:javascript
复制
std::atomic<K *> data;
K *old_value = NULL;
K *new_value = new K();
if (!data.compare_exchange_strong(old_value, new_value, m1, m2)) {
    delete new_value;
}
do_something(old_value);

代码语言:javascript
复制
std::atomic<K *> data;
K *i = data.load(m3);
K *j;
do {
   j = i + 1;
} while (data.compare_exchange_weak(i, j, m4, m5);
do_something(j);

m1m2m3m4m5的有效值是什么?我的理解是,所有的代码都可以是std::memory_order_relaxed的,因为整个代码在很大程度上依赖于前面操作的结果(假设do_something只使用指针,不改变全局的共享状态)。我的读数正确吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-02 01:29:25

这个问题只有在具有定义良好的共享状态的多线程场景中才有意义。在不知道其他线程做什么的情况下,我只能假设它读/写data。有了这个单点的同步点,完全放松的排序应该可以做得很好。对于独立于其他同步点考虑的任何给定原子,操作仍然是原子的,它们的相对顺序仍然是正确的。

现在,如果共享状态由多个变量组成(这就是“排序”发挥作用的地方),这将是一个完全不同的故事;您将不得不担心获取/释放/等语义。在这种情况下:

relaxed

  • 不保证一个线程对多个变量的更改将以相同的顺序对另一个线程可见;
  • 不保证对独立于不同线程(例如,线程1设置data1,线程2设置data2)所做的多个变量的更改将以相同的顺序对所有其他线程可见。

acquire/release (分别在每次读/写时使用;对于不同的排序参数模式,第一项可能会变得更加宽松)

  • 保证一个线程对多个变量的更改将以相同的顺序对另一个线程可见;
  • 不保证对独立于不同线程的多个变量所做的更改将以相同的顺序对所有其他线程可见。

seq_cst (同样,在每次读/写时使用):

  • 保证一个线程对多个变量的更改将对同一order;
  • guarantees中的另一个线程可见,而对独立于不同线程的多个变量所做的更改将以相同的顺序对所有其他线程可见,无论它是什么。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11763571

复制
相关文章

相似问题

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