std::atomic<bool> 和拉姆达
std::atomic<bool> and lamda
有人知道为什么这个程序会进入无限循环,而不是在 5 秒左右后停止吗?
最新的 gcc 和 clang 编译器都会出现这种情况; atomic_bool
是否遇到与 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;
}
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 的(副本)存储到一个由 f
管理的 async
对象中。
当 f
超出范围时,其析构函数等待异步任务完成。但是因为 f
的范围比 stop
的持续时间更长,所以我们在 f
等待线程完成之前离开 stop
的范围。
所以我们的线程在 stop
通过悬空引用不再存在后继续访问 stop
。
这会导致未定义的行为;您的程序的任何行为都符合标准。
有人知道为什么这个程序会进入无限循环,而不是在 5 秒左右后停止吗?
最新的 gcc 和 clang 编译器都会出现这种情况; atomic_bool
是否遇到与 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;
}
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 的(副本)存储到一个由 f
管理的 async
对象中。
当 f
超出范围时,其析构函数等待异步任务完成。但是因为 f
的范围比 stop
的持续时间更长,所以我们在 f
等待线程完成之前离开 stop
的范围。
所以我们的线程在 stop
通过悬空引用不再存在后继续访问 stop
。
这会导致未定义的行为;您的程序的任何行为都符合标准。