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

news/2024/7/1 21:14:47

在进行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 <time.h>

void millisleep(uint32_t milliseconds) {

    struct timespec ts = {

        milliseconds / 1000,

        (milliseconds % 1000) * 1000000

    };

    while ((-1 == nanosleep(&ts, &ts)) && (EINTR == errno));

}

 

2) 基于nanosleep的微秒级封装

#include <time.h>

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 <chrono>

#include <system_error>

#include <thread>

 

std::this_thread::sleep_for(std::chrono::milliseconds(1000));

#endif // __cplusplus >= 201103L

 

6) 微秒睡眠

#if __cplusplus >= 201103L

#include <chrono>

#include <system_error>

#include <thread>

 

std::this_thread::sleep_for(std::chrono::microseconds(1000));

#endif // __cplusplus >= 201103L

 

上述介绍的sleep函数均不方便控制它们提前结束,如果需要这种sleep,可基于pthread_cond_timedwait实现,实现可参考CEvent源码:

https://github.com/eyjian/libmooon/blob/master/src/sys/event.cpp

转载于:https://www.cnblogs.com/aquester/p/10321395.html


http://www.niftyadmin.cn/n/4518239.html

相关文章

Apache Hadoop生态系统

Hadoop从诞生至今已经发展成为一个大数据相关的庞大的软件生态系统。这里收集整理了跟Hadoop相关的Apache下的开源项目&#xff0c;以供后续分析研究。 Apache Hadoop Hadoop是一个大数据处理框架&#xff0c;它可用于从单台到数以千计的服务器集群的存储和计算服务。HadoopDis…

AlexNet卷积神经网络【前向反馈】

1.代码实现 1 # -*- coding: utf-8 -*-2 """3 Created on Wed Nov 14 17:13:05 20184 5 author: zhen6 """7 8 from datetime import datetime9 import math10 import time11 import tensorflow as tf12 13 batch_size 3214 num_batchs 10015 …

【Atcoder】 [ARC158D] Equation

题目链接 Atcoder方向 Luogu方向 题目解法 考虑等式两边都为多次齐次项 令等式左边的值为 F ( x , y , z ) F(x,y,z) F(x,y,z)&#xff0c;等式右边的值为 G ( x , y , z ) G(x,y,z) G(x,y,z) 当 F ( x , y , z ) ≡ t ∗ G ( x , y , z ) ( m o d p ) F(x,y,z)\equiv t*…

领导说“你不喝就是看不起我”,用这3套话术硬怼,让小人掉价

朋友逼你喝酒&#xff0c;“你不喝就是不给我面子”&#xff0c;你怎么怼都可以&#xff0c;大不了这样的朋友不要了。但是领导也这样强迫你喝酒&#xff0c;“你不喝就是看不起我”&#xff0c;你怎么才能怼出高情商呢&#xff1f;看到最后&#xff0c;千古一招&#xff0c;足…

人到中年请客求人,三请三不请,看透这3种人,别遭人打脸

人到中年&#xff0c;多事之秋。上有老&#xff0c;下有小&#xff0c;中间有房贷。人过五十&#xff0c;家家有本难念的经&#xff0c;遇到难事&#xff0c;只能弯下腰、低下头&#xff0c;请客求人自所难免。人到中年&#xff0c;就要知己知彼&#xff0c;既有自知之明&#…

领导发微信,该回“收到”还是“好的”?回复不当,被领导敲打

前几天&#xff0c;王总给华子发微信&#xff1a;“明天李董要来&#xff0c;航班12345&#xff0c;你准备一下。”华子迅速回复“收到”&#xff08;好的&#xff09;。职场上多么平常的一种回复啊。王总扭头对总监说&#xff0c;华子这小子&#xff0c;以后还要多敲打敲打。领…

你真的会给领导发微信吗?三发三不发,不懂这6招,必被敲打

微信&#xff0c;已经成为最为普及的即时通讯工具。我们在生活和工作中&#xff0c;大量应用微信沟通。但是&#xff0c;你真的会给领导发微信吗&#xff1f;前不久&#xff0c;出了几件芝麻绿豆大的“糗事”&#xff1a;比如&#xff0c;某员工回复领导“嗯”被辞退&#xff0…

JavaSE 8—新的时间和日期API

本文由 ImportNew - 胡 劲寒 翻译自 oracle。如需转载本文&#xff0c;请先参见文章末尾处的转载要求。ImportNew注&#xff1a;如果你也对Java技术翻译分享感兴趣&#xff0c;欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。 为什么我们需要一个新的时间日期API Java…