在C ++中暂停-哪种方法?

时间:2018-10-30 20:52:34

标签: c++ sleep thread-sleep

我注意到在C ++中有两种不同的“暂停”方式。 (尽管我认为它的专有名称是sleep ing。)

方法1,(可能是最熟悉的方法):

#include <iostream>
#include <unistd.h>
int main() {
  std::cout<<"Hello, "<<std::endl;
  sleep(1);
  std::cout<<"world!\n";
  return 0;
}

还有我首先学到的方法:

#include <iostream>
#include <thread>
#include <chrono>
int main() {
  std::cout<<"Hello, "<<std::endl;
  std::this_thread::sleep_for(std::chrono::seconds(1));
  std::cout<<"world!\n";
  return 0;
}

我不是在问哪种方法是正确的,(它们都做同样的事情),而是在问哪种是使用率更高的“已接受” 。另外,在速度/性能等方面,两者之间有区别吗?

2 个答案:

答案 0 :(得分:7)

这两种方法的区别在于可移植性:

    sleep中的
  • unistd.h是C POSIX库的一部分,因此仅在提供POSIX-API的系统(例如Linux,BSD等)上可用,但不提供在Windows上

  • std::this_thread::sleep_for是C ++标准库的一部分(自C ++ 11起),因此可在所有支持C ++ 11及更高版本的平台上使用。

如果可以选择,请使用std::this_thread::sleep_for仅依赖C ++ 11实现,而不依赖System API。

答案 1 :(得分:3)

主要区别:

  • std::this_thread::sleep_for是标准函数(自C ++ 11起)。 sleep是POSIX标准功能,因此仅在支持POSIX的系统上可用。
  • sleep的参数单位是秒,而std::this_thread::sleep_for允许使用任何std::chrono::duration(尽管用于测量的时钟具有其自身的粒度,可能不太精确)超过您指定的时间)。
  • std::this_thread::sleep_for的行为未定义为可能干扰程序流的信号。通常,std::this_thread::sleep_for会像sleep一样被过早中断,但是没有一种简单的方法来找出剩余的睡眠时间。另一方面,sleep返回剩余的睡眠时间,因此使用休眠循环直到返回的睡眠时间为零很容易处理中断。