【发布时间】:2017-10-09 22:14:17
【问题描述】:
从Multiple assignment in one line 开始,我很想知道原子数据类型是如何工作的,尤其是布尔类型的示例。
给定:
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之前将b设置为true,以将其值分配给a,所以在指令结束时a 的值是true?
(这也意味着后一个版本似乎效率较低)
【问题讨论】:
-
很难说没有看到实际的编译器输出,但
std::atomic::operator=()应该返回传递给它的值,所以我认为a = ...不会实际读取@ 的值987654335@,它只会从operator=的输出中接收false。现在,在多线程情况下,当reset()退出时,b仍然可能是true,但这是另一回事。 -
@RemyLebeau 好吧,那几乎可以回答我的问题,应该没有任何区别,否则编译器将是次优的。谢谢! (当然,
reset的末尾可能是b是true如果另一个线程干预)
标签: c++ multithreading c++11 atomic