gpt4 book ai didi

c++ - 谁能解释一下((a == 1 && a == 2 && a == 3)== true)?

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

根据输出的信息,任何人都可以解释下面的代码吗?

(a==1 && a==2 && a==3) 如何全部为真?

#include <iostream>
#include <thread>

int a = 0;

int main()
{
std::thread runThread([]() { while (true) { a = 1; a = 2; a = 3; }});
while (true)
{
if (a == 1 && a == 2 && a == 3)
{
std::cout << "Hell World!" << std::endl;
}
}
}

输出:

Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!
Hell World!

...


2019 年 1 月

我认为这个问题与此链接高度相关 -> C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?

最佳答案

您遇到未定义的行为。

您的代码存在竞争条件;一个线程正在阅读 a而另一个正在写入,并且没有发生同步。在 C++ 中不允许这样做。执行此操作的程序可以编译为任何事情

事实上,在发布版本中,我希望编译为 if(false) .编译器优化了主线程,注意到没有同步,证明没有 UB 时 a 不能是 3 个不同的值,并优化了 if。 .

在调试版本中,我可以预料到您看到的症状。不是因为它更正确,而是因为调试版本往往不会遇到那种未定义的行为。

因此,要合理地讨论您的程序,您要做的第一件事就是删除未定义的行为:make a一个std::atomic<int>而不是 int .

现在,在发布和调试中,您希望看到的...正是您的测试所显示的内容。或无。或者介于两者之间的任何东西。结果不再是未定义的,但它仍然是不确定的。

if声明不是原子的。在条件之间,a可以改变。对于一个永远运行的程序,它有时会发生,因为另一个线程正在改变它。

生成的程序定义明确。 Even forward progress guarantees没问题,因为你读取了一个原子变量。

关于c++ - 谁能解释一下((a == 1 && a == 2 && a == 3)== true)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52613308/

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