在我的项目中,我需要每隔n秒轮询一些设备并睡眠并永远继续。我创建了一个async任务,启动为async而不是std::thread
。但是如果我在异步任务中使用std::this_thread::sleep_for()
并将其作为async启动,那么它看起来实际上是阻塞了我的主线程?
以下程序永远输出“Inside Async ..”,它从不打印“Main function”。
如果我使用std::thread()
,它可以正常工作,而不是异步。但我想使用异步任务,因为我不必加入它并管理它的生命周期,而不像线程。
如何让异步任务睡眠?
#include <iostream>
#include <future>
#include <thread>
int main()
{
std::async(std::launch::async,
[]()
{
while(true)
{
std::cout <<"Inside async.."<< std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
}
});
std::cout <<"Main function"<< std::endl;
return 0;
}
答案 0 :(得分:7)
std::async
返回std::future
,等待任务在其析构函数中完成。将std::future
保存在某处以延迟析构函数:
auto future = std::async(...)
。
答案 1 :(得分:2)
std::async
返回一个立即销毁的std::future
(它是一个临时的,不会被const引用延长或移动到某个对象中)。
std::future
的析构函数阻塞,直到std::future
呈现的异步结果完成。由于您的异步任务尚未完成,因此std::async
的调用将永久阻止。
延长未来的生命周期也无济于事,因为它的析构函数会在某些时候阻塞,你的异步任务永远不会结束。在这里使用std::thread
似乎是合适的。
事实上,我建议你使用一些第三方定时器实现,因为你想要的是一个定期执行的异步任务。这对计时器来说非常完美。