睡眠异步任务

时间:2017-08-22 12:27:54

标签: c++ multithreading c++11 c++14 future

在我的项目中,我需要每隔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;
}

2 个答案:

答案 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似乎是合适的。

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