2016-10-02 74 views
-2

我有以下代碼(多線程版本):C++多線程代碼執行在相同的時間單線程

std::vector<std::thread> threads; 
for (size_t i = 0; i < videos.size(); ++i) { 
     threads.push_back(std::thread([&features, i]() { 
      for (size_t j = 0; j < videos.at(i).size(); ++j) { 
       features.extract(...); 
      } 
     }); 
     threads.back().join(); 
} 

的問題是,在單線程版本需要大約3分鐘來執行與多線程再次取大約3分鐘即可執行。外部for循環兩次,所以有兩個線程。我不應該看到執行時間有所改進嗎?甚至幾秒鐘?

+1

你不應該立即加入.. 。然後你的工作與線程創建的開銷串聯... – Jarod42

+0

@ Jarod42我應該什麼時候加入?也許在外環之後? – DimChtz

+0

也你必須加入整個線程向量。 – user1810087

回答

4

你不應該立即加入...至於那麼你在創建線程的開銷串行工作...

您的代碼應該是這樣的:

std::vector<std::thread> threads; 
for (std::size_t i = 0; i != videos.size(); ++i) { 
    threads.emplace_back([&features, i]() { 
     for (size_t j = 0; j < videos.at(i).size(); ++j) { 
      features.extract(...); 
     } 
    }); 
} 
for (auto& t : threads) { 
    t.join(); 
} 
+0

你上面的評論解釋了爲什麼它應該是這樣,我建議在這裏添加它以及更完整的答案。 – user2296177

+0

謝謝,它確實有效。令人驚訝的是,從3分鐘開始,它降至25秒,是的,它的效果與單線程相同,但這又如何呢?我的意思是我認爲最好的方案是將執行時間減少一半(1.5分鐘),因爲有2個線程。 – DimChtz