2016-10-02 3 views
-2

と同じ時間で実行される:C++マルチスレッド・コードは、私は、次のコード(マルチスレッド・バージョン)を有するsinglethreaded

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(); 
} 

問題はsinglethreadedバージョンを実行するのに約3分を要し、マルチスレッドが再びかかることです約3分実行します。外側のforループは2回のため、2つのスレッドがあります。実行時間が少し改善されるべきではないでしょうか?数秒でさえ?

+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

ありがとう、それは働いた。驚くべきことに3minsからわずか25secになりました。はい、シングルスレッドと同じ結果が得られますが、これはどのように可能ですか?私は、2つのスレッドがあるため、実行時間を半分(1.5分)に短縮するのが最善のシナリオだと考えました。 – DimChtz

関連する問題