我注意到在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;
}
我不是在问哪种方法是正确的,(它们都做同样的事情),而是在问哪种是使用率更高的或“已接受” 。另外,在速度/性能等方面,两者之间有区别吗?
答案 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
返回剩余的睡眠时间,因此使用休眠循环直到返回的睡眠时间为零很容易处理中断。