我坚持执行异步功能。现在,该函数被同步调用。它在列表上存储一些信息,稍后提供有关列表项的信息。
// Read Infos
void MyManager::Read(HWND parent)
{
// do some work...
mItemInfos.push_back(info);
}
// provide information
ItemInfo* MyManager::GetInfo(int index)
{
return mItemInfos.at(index);
}
现在,我想进行异步读取。我定义了一种新方法
void MyManager::BeginRead(HWND parent)
{
mFuture = std::async(std::launch::async, &MyManager::Read, this, parent);
}
现在,当在Read
方法中引发异常时,我将永远不会知道,因为从未调用mFuture.get()
方法。要解决此问题,我应该只在mFuture.get()
中致电GetInfo()
吗?每次我打电话给GetInfo()
时?
我的整个方法似乎缺少某些东西,有人可以帮我吗?
预先感谢
答案 0 :(得分:1)
看代码,我看到多个问题:
.get()
?对于std::future
,仅允许调用.get()
一次。如果您想多次调用它,则需要std::shared_future
,它将抛出每次访问权限。
那么,在访问引导程序之前,您应该打.get()
吗?当然是。否则,您不能保证该元素将在向量中。
但是,您还应该为访问向量添加一些同步,因为一个线程可能会尝试访问它,而另一个线程会创建一个新的Future来重新分配您正在访问的向量。
最后,为什么您要浪费时间创建新线程?该操作本身看起来很便宜。即使不是,我也只能假设您不想在这一点上进行封锁。不幸的是,您不会阻止阻止,因为std::future
的Dtor在某些情况下会阻止。
同样,使用std::shared_future
可以防止这种情况,但是,您不再拥有对其是否已执行的控制权,因为第二次分配使mFuture
忘记了第一个任务,即使未完全执行