有人知道为什么这个程序进入无限循环,而不是在5s左右停止?
最新的gcc和clang编译器都会发生这种情况; atomic_bool
与[{1}}
bool
如果我使用atomic<int>
,这样可以正常使用。
#include <algorithm>
#include <memory>
#include <utility>
#include <iostream>
#include <vector>
#include <functional>
#include <future>
#include <chrono>
using namespace std;
using namespace chrono_literals;
void send_heart_beat()
{
cout << "sending heartbeat" << endl;
}
std::future<void> f;
int main()
{
std::atomic<bool> stop(false);
f = std::async(std::launch::async,[&stop]() { while(!stop) { send_heart_beat(); std::this_thread::sleep_for(1s); } });
std::this_thread::sleep_for(5s);
stop = true;
}
答案 0 :(得分:1)
std::atomic<bool> stop(false);
std::future<void> f;
这两个变量位于不同的范围内,f
的范围比stop
的范围更长。
f = std::async(std::launch::async,[&stop]() { while(!stop) { send_heart_beat(); std::this_thread::sleep_for(1s); } });
这里我们将对stop
的引用绑定到lambda中,然后将该lambda的(副本)存储到由async
管理的f
对象中。
当f
超出范围时,其析构函数会等待异步任务完成。但由于f
的范围比stop
更持久,我们会在stop
等待线程完成之前离开f
的范围
因此,我们的帖子在stop
通过悬空引用不再存在后,无意识地继续访问stop
。
这会导致未定义的行为;您的计划的任何行为都是标准所接受的。