簡體   English   中英

在多線程環境中啟動 std::async function 后,有什么方法可以加速 future.get() function?

[英]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對象?

想到幾件事:

  1. 你說這是“違背了使用多線程的目的”。 如果您按順序運行此代碼(即刪除多線程代碼並循環處理每個圖像),該代碼的運行時間是多少? 我敢打賭,這遠遠超過 9 秒。

  2. std::async調用僅創建任務/線程/任何內容,但不啟動它,也不保證它會在一定時間后完成。 當您調用get()時,您會強制您的程序等待它,並且一個不錯的 C++ 庫將執行您正在等待的線程。 這不是一個嚴格的保證,但否則任何行為都會使這種代碼從一開始就毫無用處。 測量線程的啟動很有用,但在測量實際操作需要多長時間的意義上並沒有多大作用(除非線程的開銷大於組合操作的運行時間)。

  3. 您應該std::move未來的結果。 看起來您可能正在創建數據的副本,這可能會無緣無故地影響性能。

  4. 創建這么多線程將不可避免地導致資源爭用,無論是磁盤還是 memory 帶寬、CPU,甚至是 memory 大小。 一般來說,最好設置一個線程池,其中有 N 個線程(其中 N 是系統上可用的核心數量或“多線程核心”),以及一些任務隊列,當線程處理啟動新作業時釋放。 請注意, std::async可能確實已經在后台執行此操作(據我所知,實現可以自由地通過池來實現這一點,也取決於傳遞給std::async的其他選項)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM