2 Stimmen

Blockiert chrono::steady_clock auf Threads?

Ich bin auf ein Problem gestoßen, als ich einige Threads starten wollte, um für eine bestimmte Zeit einige Berechnungen durchzuführen. Aber die gesamte verstrichene Zeit ist immer größer als die Summe der für jeden Thread zugewiesenen Zeit, während ich erwartet hätte, dass sie eher dem Maximum entspricht. Wo liegt mein Missverständnis?

Einige Beispielscode:

#include 
#include 

void do_some_wait(int time);

int main() {
  using std::thread;
  thread t1(&do_some_wait, 1);
  thread t2(&do_some_wait, 1);
  thread t3(&do_some_wait, 1);

  t1.join(); t2.join(); t3.join();
}

void do_some_wait(int time) {
  using std::chrono::steady_clock;
  using std::chrono::seconds;
  auto end = steady_clock::now() + seconds(time);

  while (steady_clock::now() < end) { /* einige Berechnungen */ }
}

Ich würde erwarten, dass dies etwa 1 Sekunde dauert. Aber es dauert etwa 3.

$ clang++ -std=c++11 -stdlib=libc++ -Wall -pedantic thread.cpp -o thread && time ./thread
./thread  2.96s user 0.00s system 295% cpu 1.003 total

1voto

Mats Petersson Punkte 123984

Der 2.96s Benutzer in der Ausgabe von time ist die Menge an CPU-Zeit, die Sie verwendet haben. Wenn Sie drei Threads auf einem Prozessor ausführen, der mindestens drei Kerne hat [und es gibt nicht viel Wettbewerb von anderen Prozessen], verwenden Sie fast 3 Sekunden CPU-Zeit. Die Gesamtzeit beträgt 1,003s, was für einen 1-Sekunden-Thread plus ein wenig Overhead am Anfang/Ende vernünftig ist.

0voto

Lajos Arpad Punkte 53001

Es dauert 1,003 Sekunden. Du hast nicht auf die Ausgabe geachtet, die deine Erwartungen erfüllt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X