![](/img/trans.png)
[英]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.