std :: atomic <bool>和lamda

时间:2018-01-04 13:16:43

标签: c++11 atomic stdasync

有人知道为什么这个程序进入无限循环,而不是在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;
}

1 个答案:

答案 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

这会导致未定义的行为;您的计划的任何行为都是标准所接受的。