gpt4 book ai didi

c++ - 原子 bool 变量的一条语句中的多重赋值

转载 作者:行者123 更新时间:2023-11-30 01:39:01 29 4
gpt4 key购买 nike

跟进自 Multiple assignment in one line ,我很想知道这对原子数据类型是如何工作的,特别是 bool 类型的例子。

给定:

class foo {
std::atomic<bool> a;
std::atomic<bool> b;
public:
void reset();
[...] //Other methods that might change a and b
}

有什么区别:

void foo::reset() {
a = false;
b = false;
}

和:

void foo::reset() {
a = b = false;
}

即在第二种情况下,是否会发生在b被赋值为false后,另一个线程将b设置为true b 被读取之前将其值赋给 a,因此在指令结束时 a 的值是

(这也意味着后一个版本似乎效率较低)

最佳答案

是的,两者之间有区别

a = false;
b = false;

a = b = false;

如果 ab 是原子的。由于赋值是从右到左完成的,所以后者等同于

b = false;
a = false; // since atomic::operator= (from above) returns its argument

这与第一个版本不同,因为 ab 是原子的,并且 assignment is done就好像 std::atomic::store 是用内存顺序 memory_order_seq_cst 调用的。因此,内存模型 guarantees

a single total modification order of all atomic operations that are so tagged.

因此,第二个线程执行原子加载 (bool a_observed = a.load(); bool b_observed = b.load();) reverse存储顺序(a = b = false;)可以通过以下三种方式之一观察变化:

  • ba 的旧值
    • 加载a,加载b存储b存储a
  • b 的新值和 a 的旧值
    • 存储b,加载a存储a,加载b
    • 存储b,加载a,加载b存储a/li>
    • 加载a,存储b存储a,加载b
    • 加载a,存储b,加载b存储a/li>
  • ba 的新值
    • 存储b,存储a,加载a,加载b

相比之下,memory_order_seq_cst 用于在 a 之前存储 b 而(在另一个线程中)加载 ab 之前保证永远不会观察到以下内容:

  • a 的新值和 b 的旧值>

关于c++ - 原子 bool 变量的一条语句中的多重赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655766/

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