[英]C++ std::async() terminate on exception before calling future.get()
[英]Is there any way to speedup the future.get() function after launching the std::async function in a multithreaded environment?
我有一个使用 openCV 处理 1000 个图像文件的正确工作代码。 由于操作独立于单个文件,因此我使用std::async
function 使用多线程。
我通过在for
循环中调用 function 来启动线程。
std::vector<std::future<cv::Mat>> processingThread;
for (int i = 0; i < jsonObjects.size(); i++) {
processingThread.emplace_back(std::async(std::launch::async, (cv::Mat(CameraToBEV::*)(json&, std::vector<cv::Point2f>, cv::Point2f, cv::Point2f)) & CameraToBEV::process, &cbevVec[i], std::ref(jsonObjects[i]), roiBox1, opDim,ipDim));
}
上面的代码工作正常,大约需要100 毫秒。 但是为了收集结果,我使用了另一个for
循环,如下所示;
std::vector<cv::Mat> opMatArr;
for (auto& future : processingThread) {
opMatArr.emplace_back(future.get());
}
这也可以正常工作,但执行需要9 秒,这违背了使用多线程的目的,因为我正在按顺序填充cv::Mat
对象的向量。 有没有什么方法可以并行地在几毫秒内获得std::vector opMatArr
中的所有cv::Mat
对象?
想到几件事:
你说这是“违背了使用多线程的目的”。 如果您按顺序运行此代码(即删除多线程代码并循环处理每个图像),该代码的运行时间是多少? 我敢打赌,这远远超过 9 秒。
std::async
调用仅创建任务/线程/任何内容,但不启动它,也不保证它会在一定时间后完成。 当您调用get()
时,您会强制您的程序等待它,并且一个不错的 C++ 库将执行您正在等待的线程。 这不是一个严格的保证,但否则任何行为都会使这种代码从一开始就毫无用处。 测量线程的启动很有用,但在测量实际操作需要多长时间的意义上并没有多大作用(除非线程的开销大于组合操作的运行时间)。
您应该std::move
未来的结果。 看起来您可能正在创建数据的副本,这可能会无缘无故地影响性能。
创建这么多线程将不可避免地导致资源争用,无论是磁盘还是 memory 带宽、CPU,甚至是 memory 大小。 一般来说,最好设置一个线程池,其中有 N 个线程(其中 N 是系统上可用的核心数量或“多线程核心”),以及一些任务队列,当线程处理启动新作业时释放。 请注意, std::async
可能确实已经在后台执行此操作(据我所知,实现可以自由地通过池来实现这一点,也取决于传递给std::async
的其他选项)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.