2016-10-02 116 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