内容简介:在进行C/C++1) 基于
在进行 Linux C/C++ 编程时,可调用的 sleep 函数有好多个,那么究竟应当调用哪一个了?下表列出了这几个函数间的异同点,可作为参考:
性质 |
精准度 |
线程安全 |
信号安全 |
||
sleep |
libc库函数 |
秒 |
是 |
不能和alarm同时使用 |
有些是基于alarm实现的,所以不能和alarm同时使用 |
usleep |
libc库函数 |
微秒 |
- |
- |
POSIX.1-2001已将usleep标注为废弃,POSIX.1-2008已删除usleep,应当使用nanosleep替代usleep |
nanosleep |
系统调用 |
纳秒 |
是 |
不确定 |
即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 |
clock_nanosleep |
系统调用 |
纳秒 |
是 |
不确定 |
区别于nanosleep,可选择为相对或绝对时间,其次是可以选择使用哪个时钟 |
poll |
系统调用 |
毫秒 |
是 |
是 |
在协程库libco中可安全使用,如被信号中断,则实际睡眠时长会小于参数指定的时长 |
ppoll |
系统调用 |
纳秒 |
是 |
是 |
如被信号中断,则实际睡眠时长会小于参数指定的时长 |
select |
系统调用 |
微秒 |
是 |
是 |
即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 |
pselect |
系统调用 |
纳秒 |
是 |
是 |
如被信号中断,则实际睡眠时长会小于参数指定的时长 |
C/C++ 常用封装:
1) 基于 nanosleep 的毫秒级封装
#include
void millisleep (uint32_t milliseconds) {
struct timespec ts = {
milliseconds / 1000,
(milliseconds % 1000) * 1000000
};
while ((-1 == nanosleep(&ts, &ts)) && (EINTR == errno));
}
2) 基于 nanosleep 的微秒级封装
#include
void microsleep (uint32_t microseconds) {
struct timespec ts = {
microseconds / 1000000,
(microseconds % 1000000) * 1000
};
while ((-1 == nanosleep(&ts, &ts)) && (EINTR == errno));
}
3) 基于 poll 的秒级封装
// 可libco协程库中安全使用
void pollsleep (int milliseconds) {
(void)poll(NULL, 0, milliseconds);
}
4) 基于 select 的毫秒级封装
void selectsleep (int milliseconds) {
struct timeval timeout = {
milliseconds / 1000,
(milliseconds % 1000)
};
struct timeval old_timeout = { timeout.tv_sec, timeout.tv_usec };
while (true) {
(void)select(0, NULL, NULL, NULL, &timeout);
if (timeout.tv_sec<=0 && timeout.tv_usec<=0)
break;
}
}
如果开发环境是 C++11 或更高版本,则可直接使用 C++ 标准库提供的:
5) 毫秒睡眠
#if __cplusplus >= 201103L
#include
#include
#include
std::this_thread:: sleep_for (std::chrono:: milliseconds (1000));
#endif // __cplusplus >= 201103L
6) 微秒睡眠
#if __cplusplus >= 201103L
#include
#include
#include
std::this_thread:: sleep_for (std::chrono:: microseconds (1000));
#endif // __cplusplus >= 201103L
上述介绍的 sleep 函数均不方便控制它们提前结束,如果需要这种 sleep ,可基于 pthread_cond_timedwait实现,实现可参考 CEvent 源码:
以上所述就是小编给大家介绍的《Linux中的sleep、usleep、nanosleep、poll和select》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。