Linux中的sleep、usleep、nanosleep、poll和select

栏目: C++ · 发布时间: 7年前

内容简介:在进行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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Docker——容器与容器云(第2版)

Docker——容器与容器云(第2版)

浙江大学SEL实验室 / 人民邮电出版社 / 2016-10 / 89.00元

本书根据Docker 1.10版和Kubernetes 1.2版对第1版进行了全面更新,从实践者的角度出发,以Docker和Kubernetes为重点,沿着“基本用法介绍”到“核心原理解读”到“高级实践技巧”的思路,一本书讲透当前主流的容器和容器云技术,有助于读者在实际场景中利用Docker容器和容器云解决问题并启发新的思考。全书包括两部分,第一部分深入解读Docker容器技术,包括Docker架......一起来看看 《Docker——容器与容器云(第2版)》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试