C++ 如何检查std::async任务是否完成?

C++ 如何检查std::async任务是否完成?,c++,multithreading,asynchronous,c++11,std,C++,Multithreading,Asynchronous,C++11,Std,在我的图形应用程序中,我想在另一个线程中生成一批网格。因此,我使用std::async异步调用成员函数 task = async(launch::async, &Class::Meshing, this, Data(...)); 在更新循环中,我尝试检查线程是否准备就绪。如果是,我会将网格发送到视频卡并开始下一个线程。如果没有,我将跳过这些操作 #include <future> using namespace std; class Class { public:

在我的图形应用程序中,我想在另一个线程中生成一批网格。因此,我使用
std::async
异步调用成员函数

task = async(launch::async, &Class::Meshing, this, Data(...));
在更新循环中,我尝试检查线程是否准备就绪。如果是,我会将网格发送到视频卡并开始下一个线程。如果没有,我将跳过这些操作

#include <future>
using namespace std;

class Class
{
public:
    void Update()
    {
        if(task.finished()) // this method does not exist
        {
            Data data = task.get();
            // ...
            task = async(launch::async, &Class::Meshing, this, Data(/* ... */));
        }
    }

private:
    struct Data
    {
        // ...
    };
    future<Data> task;
    Data Meshing(Data data)
    {
        // ...
    }
};
#包括
使用名称空间std;
班级
{
公众:
无效更新()
{
if(task.finished())//此方法不存在
{
Data=task.get();
// ...
task=async(launch::async,&Class::Meshing,this,Data(/*…*/);
}
}
私人:
结构数据
{
// ...
};
未来任务;
数据网格(数据)
{
// ...
}
};
如何检查异步线程是否已完成,而没有阻塞更新函数?

使用。您可以指定超时,然后获取状态代码

例子:
这将返回
future\u status::ready
future\u status::deferred
future\u status::timeout
,以便您知道操作的状态。您还可以指定超时0,以使检查尽快返回。

std::future有一个is_ready成员函数。同时,VC实现有一个_Is_ready()成员。

这是一个尽可能接近的成员,等待0秒,但不能保证它不会阻塞…继续读取。。。“由于调度或资源争用延迟,此函数可能会阻塞超过超时时间。”是的,我已经看到了。但这仅仅意味着它的阻塞时间可能比超时时间长一点。因此,如果操作需要2分钟,并且您指定了500毫秒的超时,那么它将比2分钟更早返回。因此,如果您有很多线程,操作系统的调度程序可能不会立即切换回您,这可能会导致稍长的超时。但在异步操作终止之前,它不会阻塞。关键是它可能会阻塞,即使指定为等待0秒。它可能不会像您在回答中所说的那样立即返回。如果你只想知道未来是否准备好了,那么就要避免阻塞和上下文/线程切换。@K-ballo:测试未来是否准备好本身就是一个共享状态的操作,因此它需要获取共享状态内的锁,这可能会阻塞。也就是说,标准中的措辞并不意味着除了明显的,你不能得到比
wait\u for
更好的东西。我认为最接近的方法是使用
std::future::wait\u for
,使用你能管理的最小持续时间。看来标准的
future
没有继承Boost
future
已准备就绪的成员函数,那真是太遗憾了……我真的想推荐赫伯·萨特(Herb Sutter)对异步期货的看法,它们的局限性是什么,以及克服它们的一些可能的方法。@SeanCline:我想指出的是,boost::future已经实现了其中的一些扩展,比如
wait_for u any
wait_for u all
。我们只是缺少了
,然后
。@ronag:你让我想了一下,我们已经有了这些。。。是的,我们缺少了
,然后是
及其派生的一个,它是非标准的,依赖于实现的,您不应该使用它。
task.wait_for(std::chrono::seconds(1));