所以你可以创建一个在被调用std::future
之前不起作用的:.get()
auto f_deferred = std::async( std::launch::deferred, []{ std::cout << "I ran\n"; } );
您还可以编写一个std::future
可等待的,并且可以通过任何线程中的代码随时准备好:
std::packaged_task<void()> p( []( std::cout << "I also ran\n"; } );
auto f_waitable = p.get_future();
如果你打电话f_deferred.wait_for(1ms)
,它不会打扰等待。如果你调用f_deferred.get()
,你选择的一个 lambda (在这种情况下,一个打印的"I ran\n"
执行。
如果您调用f_waitable.get()
,则管理任务的代码无法知道有人在等待未来。但如果你打电话f_deferred.wait(1ms);
,你会future_status::deferred
立即得到。
有什么办法可以将这两者结合起来吗?
一个具体的用例是当人们排队任务时线程池返回期货。如果未排队的未来是.get()
'd,我想使用被阻塞的线程来执行任务,而不是让它空闲。另一方面,我希望拥有返回期货的人能够确定任务是否完成,甚至等待有限的时间来完成任务。(如果您正在等待,我可以在您等待期间您的线程处于空闲状态)
如果做不到这一点,在即将到来的提案中是否有比让我的线程池返回具有所有限制的未来更好的解决方案?我听说期货没有未来,期货解决的问题存在更好的解决方案。