线程上是chrono :: steady_clock阻塞吗?

时间:2013-07-10 10:06:02

标签: c++ multithreading c++11

当我想在一段时间内生成一些线程来进行一些计算时,我遇到了一个问题。但是经过的总时间总是大于每个线程分配时间的总和,而我预计它会超过最大值。我在这里不理解什么?

一些示例代码:

#include <thread>
#include <chrono>

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) { /* some calculations */ }
}

我希望这需要大约1秒才能执行。但它需要~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

2 个答案:

答案 0 :(得分:1)

2.96s user输出中的time是您使用的CPU时间。如果你在一个至少有三个内核的处理器上运行三个线程,每个线程一秒钟,并且没有太多来自其他进程的竞争,那么你将使用3秒CPU时间的最佳部分。总时间为1.003s,这对于1s的线程是合理的,加上开始/结束时的一点开销。

答案 1 :(得分:0)

需要1.003秒。你没注意输出,这符合你的期望。