C ++何时检查异步方法的异常

时间:2018-12-18 11:37:19

标签: c++ asynchronous future

我坚持执行异步功能。现在,该函数被同步调用。它在列表上存储一些信息,稍后提供有关列表项的信息。

// 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()时?

我的整个方法似乎缺少某些东西,有人可以帮我吗?

预先感谢

1 个答案:

答案 0 :(得分:1)

看代码,我看到多个问题:

  • 在多线程中使用std :: vector时没有互斥锁->竞争条件
  • 分配未来会阻止您的程序
  • 您打算在未来的同一实例上多次致电.get()

对于std::future,仅允许调用.get()一次。如果您想多次调用它,则需要std::shared_future,它将抛出每次访问权限。

那么,在访问引导程序之前,您应该打.get()吗?当然是。否则,您不能保证该元素将在向量中。 但是,您还应该为访问向量添加一些同步,因为一个线程可能会尝试访问它,而另一个线程会创建一个新的Future来重新分配您正在访问的向量。

最后,为什么您要浪费时间创建新线程?该操作本身看起来很便宜。即使不是,我也只能假设您不想在这一点上进行封锁。不幸的是,您不会阻止阻止,因为std::future的Dtor在某些情况下会阻止。

同样,使用std::shared_future可以防止这种情况,但是,您不再拥有对其是否已执行的控制权,因为第二次分配使mFuture忘记了第一个任务,即使未完全执行