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

dan*_*jar 21 c++ multithreading asynchronous std c++11

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

task = async(launch::async, &Class::Meshing, this, Data(...));
Run Code Online (Sandbox Code Playgroud)

在我的更新循环中,我尝试检查线程是否准备好.如果是,我会将网格发送到视频卡并启动下一个线程.如果没有,我将跳过这些操作.

#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)
    {
        // ...
    }
};
Run Code Online (Sandbox Code Playgroud)

如何在不更新功能的情况下检查异步线程是否完成?

let*_*tar 19

使用future::wait_for().您可以指定超时,然后获取状态代码.

例:

task.wait_for(std::chrono::seconds(1));
Run Code Online (Sandbox Code Playgroud)

这将返回future_status::ready,future_status::deferred或者future_status::timeout,因此您知道操作的状态.您还可以指定超时0,以便尽快立即返回检查.

  • 继续阅读... _"由于调度或资源争用延迟,此函数可能会阻塞超过timeout_duration."_ (9认同)
  • @ K-ballo:测试未来是否准备好本质上是对共享状态的操作,因此它需要获取共享状态内的锁,这可能会阻止**.也就是说,标准中的措辞并不意味着它除了显而易见之外还有其他任何成本,你不能得到比"wait_for"更好的东西. (5认同)
  • 是的 - 我见过.但这仅仅意味着它可能比你的超时阻止更长时间.因此,如果操作需要2分钟,并且您指定500毫秒的超时,它将在2分钟之前返回****.因此,如果您有很多线程,操作系统的调度程序可能不会立即切换回您,这可能会导致稍长的超时.但是在异步操作终止之前它不会阻塞. (4认同)
  • 关键是它******_block_,即使指定等待0秒.当你在答案中声明时,它可能不会立即返回.如果你想知道的是未来是否准备就绪,你想要避免阻塞和上下文/线程切换. (4认同)
  • 这是一个人可以得到的,等待_0秒_,但它并不能保证它不会阻止...... (3认同)