【发布时间】:2013-01-11 21:42:20
【问题描述】:
在我的图形应用程序中,我想在另一个线程中生成批处理网格。因此我使用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::future::wait_for并以您可以管理的最短持续时间。 -
看来标准的
future没有继承Boostfutureis_ready的成员函数,真可惜…… -
我真的会推荐 this video Herb Sutter 介绍异步期货现在所处的位置、它们的局限性以及克服它们的一些可能方法。
-
@SeanCline:我想指出 boost::future 已经实现了其中的一些扩展,例如
wait_for_any和wait_for_all。我们只缺少then... -
@ronag:你让我想到我们已经有了这些......是的,我们缺少
then及其派生的
标签: c++ multithreading asynchronous c++11 std