使异步任务休眠

Sleep an Async Task

本文关键字:休眠 任务 异步      更新时间:2023-10-16

在我的项目中,我需要每n秒轮询一些设备,然后休眠并永远继续。我创建了一个异步任务,以异步而不是std::thread启动。但是,如果我在异步任务中使用std::this_thread::sleep_for()并异步启动,看起来它实际上阻止了我的主线程? 以下程序永远输出"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;
}

std::async返回一个std::future,该等待任务在其析构函数中完成。将std::future保存在某个位置以延迟析构函数:

auto future = std::async(...).

std::async返回一个立即被销毁的std::future(它是一个临时的,不会因常量引用而延长或移动到某个对象中(。

std::future块的析构函数,直到std::future呈现的异步结果完成。 由于异步任务尚未完成,因此对std::async的调用将永远停止。

延长未来的生存期将无济于事,因为它的析构函数会在某个时候阻塞,您的异步任务永远不会结束。 在这里使用std::thread似乎是合适的。

事实上,我建议你使用一些第三点计时器实现,因为你想要的是一个定期执行的异步任务。 这对于计时器来说是完美的。