C++ sleep相关延时函数

目录

秒相关单位进制转换

sleep() 函数:

usleep() 函数:

nanosleep() 函数:

C++11及以后版本的std::this_thread::sleep_for():


秒相关单位进制转换

秒(second, s)是国际单位制(SI)中时间的基本单位。以下是一些更小的时间单位与秒之间的转换关系,这些转换类似于进制转换,但实际上是以十进制为基础的比例关系:

  1. 毫秒(millisecond, ms): 1毫秒等于1秒的千分之一,即1 ms = 1/1000 s 或者 1000 ms = 1 s。

  2. 微秒(microsecond, μs): 1微秒等于1秒的百万分之一,即1 μs = 1/1,000,000 s 或者 1,000,000 μs = 1 s。

  3. 纳秒(nanosecond, ns): 1纳秒等于1秒的十亿分之一,即1 ns = 1/1,000,000,000 s 或者 1,000,000,000 ns = 1 s。

  4. 皮秒(picosecond, ps): 1皮秒等于1秒的一万亿分之一,即1 ps = 1/1,000,000,000,000 s 或者 1,000,000,000,000 ps = 1 s。

总结起来,这些更小的时间单位之间的换算遵循10的幂次规律:

  • 每前进一位,时间单位缩小1000倍。
  • 从秒到毫秒,缩小了1000倍(10^3)。
  • 从毫秒到微秒,再次缩小了1000倍(10^3)。
  • 从微秒到纳秒,又缩小了1000倍(10^3)。
  • 从纳秒到皮秒,继续缩小1000倍(10^3)。

在计算机编程中,sleep及其相关的延时函数是用于暂停程序执行一段时间的函数。以下是它们的讲解:

sleep() 函数:

  • C语言中的sleep()函数(在unistd.h头文件中定义)用于让当前进程(或线程)暂停执行指定的秒数。例如:
    #include <unistd.h>
    sleep(5); // 暂停执行5秒
  • 注意,sleep()函数精度通常以秒为单位,且它会释放CPU,让其他进程有机会运行。
  • 示例:
    #include <unistd.h>
    #include <stdio.h>int main() {printf("程序开始执行...\n");// 暂停5秒sleep(5);printf("经过5秒后,程序继续执行...\n");return 0;
    }
    在这个例子中,当程序执行到 sleep(5) 语句时,程序会暂停5秒,然后继续执行后续的 printf 语句。

usleep() 函数:

  • usleep()同样是C语言中的一个延时函数,但它提供微秒级别的暂停。同样在unistd.h头文件中定义,其原型为:
    #include <unistd.h>
    unsigned int usleep(useconds_t useconds);
  • 参数useconds是一个无符号整型数,表示暂停的微秒数(1秒=1,000,000微秒)。
  • 虽然usleep()提供了更高的时间分辨率,但在某些系统(如Windows)中并不支持,且在POSIX标准中已被弃用,推荐使用nanosleep()函数替代。
  • 示例:
    #include <unistd.h>
    #include <stdio.h>int main() {printf("程序开始执行...\n");// 暂停500毫秒(500,000微秒)usleep(500000);printf("经过500毫秒后,程序继续执行...\n");return 0;
    }

    在上述示例中,usleep(500000)会让程序暂停500毫秒,然后继续执行。需要注意的是,usleep()在一些系统中(比如Windows)可能不可用或已经被弃用,建议使用nanosleep()或者其他系统的高精度延时函数。

nanosleep() 函数:

  • nanosleep()函数提供纳秒级别的延时,相比usleep()具有更高的精度。在POSIX兼容的系统中定义,其原型如下:
    #include <time.h>
    int nanosleep(const struct timespec *req, struct timespec *rem);
  • 参数req指向一个timespec结构体,包含了要求的纳秒级延迟时间,而rem用于存储剩余的未休眠时间(可选)。
  • 示例:
     
    #include <time.h>
    #include <stdio.h>
    #include <errno.h>void nano_sleep_example() {// 创建一个timespec结构体,指定纳秒级的休眠时间struct timespec sleep_time;sleep_time.tv_sec = 1; // 秒数部分,这里是1秒sleep_time.tv_nsec = 500000000; // 纳秒数部分,这里是5亿纳秒(即0.5秒)// 调用nanosleep函数while (nanosleep(&sleep_time, NULL) == -1 && errno == EINTR) {// 如果nanosleep被信号中断,重新调用自身直到完成休眠printf("nanosleep was interrupted by a signal, retrying...\n");continue;}if (errno != 0 && errno != EINTR) {perror("An unexpected error occurred during nanosleep()");} else {printf("Sleep completed with nanosleep().\n");}
    }int main() {nano_sleep_example();return 0;
    }

    在此例中,我们首先定义了一个timespec结构体,其中包含了想要休眠的时间(1.5秒)。然后调用nanosleep()函数,如果在休眠期间收到信号导致函数提前返回,错误码errno会被设置为EINTR,这时循环会重新调用nanosleep()直到指定的时间完全过去。

C++11及以后版本的std::this_thread::sleep_for()

  • C++11引入了线程库,其中std::this_thread::sleep_for()方法可以用来暂停当前线程执行,其精度取决于编译器和系统实现,可以达到微秒甚至纳秒级别。例如:
    #include <chrono>
    #include <thread>
    std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 暂停500毫秒
  • 示例:
    #include <iostream>
    #include <chrono>
    #include <thread>void this_thread_sleep_example() {// 使用C++11的chrono库指定休眠时间,这里休眠1.5秒std::this_thread::sleep_for(std::chrono::seconds(1) + std::chrono::milliseconds(500));std::cout << "Sleep completed with std::this_thread::sleep_for().\n";
    }int main() {this_thread_sleep_example();return 0;
    }
    在C++11的例子中,我们使用了std::chrono库来创建一个表示1.5秒的持续时间对象,并将其传递给std::this_thread::sleep_for()函数。这样就能在当前线程上精确地休眠指定的时长。std::this_thread::sleep_for()函数的精度依赖于系统实现,但通常可以达到微秒甚至纳秒级别。

以上函数在多线程环境下使用时应注意同步问题,确保在等待期间不会影响到其他关键资源的访问。另外,由于系统调度的不确定性,实际暂停的时间可能会比指定的时间稍长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue watch监听的多种使用

简述&#xff1a;vue 的watch的监听使用的几种写法。常用第4中写法。 一、$route监听路由跳转 前提&#xff1a;当需要前端监听路由跳转的时候&#xff0c;一般写在App.vue入口 //App.vue //vue2、uniapp写法 watch: {$route(to, from) {if (hasPermission(to.path)) {this…

能源照明运作机制与智能调控技术实现途径

随着城市化进程的加速&#xff0c;智慧城市已成为现代城市发展的重要方向。能源照明作为城市基础设施的重要组成部分&#xff0c;其运作机制与智能调控技术的实现对于提高城市能源利用效率、促进可持续发展具有重要意义。 能源照明是一个涵盖广泛、错综复杂的领域&#xff0c;它…

Redis中的集群(一)

集群 概述 Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片(sharding)来进行数据共享&#xff0c;并提供复制和故障转移功能 节点 一个Redis集群通常由多个节点(node)组成&#xff0c;在刚开始的时候&#xff0c;每个节点都是相互独立的&#xff0c;它们都…

【优选算法专栏】专题十六:BFS解决最短路问题(二)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

奇函数+(-)偶函数一定是非奇非偶函数?

今天遇到个有意思的题&#xff0c;跟大家分享一下&#xff0c;可能有的人不太了解&#xff1a; 首先说下结论&#xff1a;这题选D选项&#xff0c;以上均有可能&#xff1b; 开始证明&#xff1a; 非奇非偶函数的充要条件&#xff1a; 定义域是(一a,a)(a>0)或(一 oo,oo)的…

【Linux】软硬链接 / 动静态库

目录 一. 软硬链接1. 硬链接2. 软链接3. unlink4. 目录的硬链接 二. 动静态库1.1 静态库制作1.2 静态库使用2.1 动态库制作2.2 动态库使用3. 动态链接原理 一. 软硬链接 1. 硬链接 硬链接(hard link) 可以将它理解为原始文件的别名, 和原始文件使用相同的 inode 编号和 data …

Mysql底层原理七:InnoDB 行记录

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1&#xff09;建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中&#xff0c;有一些特殊的技巧很重要。 比如默认地设置blender打开时&#xff0c;就是移动物体&#xff0c;这样怎么样设置的呢&#xff1f; 需要在界面里打开下面的菜单: 这样就找到默认设置的地方&#xff0c;把下面的移动勾选起来&#xff0c;这样点…

3.C++ Make

1.Makefile 1.1 什么是 Makefile 一个工程中有很多文件&#xff0c;文件之间都是相辅相成有着编译的先后顺序&#xff0c;但是如果自己手动根据编译顺序编译文件造成速度非常慢。Makefile 是”自动化编译“&#xff0c;只需一个 make 指令系统就会根据编译顺序帮自己编译文件…

【C/C++】C语言实现单链表

C语言实现单链表 简单描述代码运行结果 简单描述 用codeblocks编译通过 源码参考连接 https://gitee.com/IUuaena/data-structures-c.git 代码 common.h #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDED#define ELEM_TYPE int //!< 链表元素类型/*! brief 返回值类…

TouchableOpacity和TouchableWithoutFeedback区别

TouchableOpacity和TouchableWithoutFeedback都是React Native中定义的可触摸组件&#xff0c;但它们之间有一些区别&#xff1a; 点击效果&#xff1a;TouchableOpacity在被按下时会有一个透明度变化的点击效果&#xff0c;而TouchableWithoutFeedback则没有点击效果。 子组…

Java-Tomcat

一、web补充技术 ①&#xff1a;B/S架构 主流的方式&#xff0c;只要有浏览器即可。编程方式直接基于socket即可 ②&#xff1a;javascript 简称js&#xff0c;早期只是实现在客户端的浏览器的动态效果&#xff0c;但服务端不会解释运行&#xff0c;所以本质上是静态资源。 …

UE4_动画基础_角色的缩放

以第三人称模板进行制作。 一、首先为角色缩放新建粒子效果 1、新建niagara system&#xff0c;重命名为NS_Shrink。 2、双击打开设置参数&#xff1a; 发射器重命名&#xff1a; Emitter State&#xff1a; 发射器一次喷发数量&#xff1a; 粒子初始大小&#xff0c;生命周…

Go协程池gopool源码解析

1、gopool简介 Repository&#xff1a;https://github.com/bytedance/gopkg/tree/develop/util/gopool gopool is a high-performance goroutine pool which aims to reuse goroutines and limit the number of goroutines. It is an alternative to the go keyword. gopool的…

【Linux进阶之路】地址篇

文章目录 一、ipv4地址1. 基本概念2. 分类3.CIDR4.特殊的ip地址 二、IP协议1. 协议字段2.分片与重组3.路由 三、NAT技术1.公有和私有2.NAT3.NAPT 四、ARP协议1.MAC地址2.ARP 五、DHCP协议六、DNS协议尾序 一、ipv4地址 1. 基本概念 概念&#xff1a;IP地址&#xff0c;英文全…

从零自制docker-8-【构建实现run命令的容器】

文章目录 log "github.com/sirupsen/logrus"args...go moduleimport第三方包失败package和 go import的导入go build . 和go runcli库log.SetFormatter(&log.JSONFormatter{})error和nil的关系cmd.Wait()和cmd.Start()arg……context.Args().Get(0)syscall.Exec和…

【Leetcode每日一题】 递归 - 验证二叉搜索树(难度⭐⭐)(53)

1. 题目解析 题目链接&#xff1a;98. 验证二叉搜索树 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 中序遍历是二叉树遍历中的一种重要方式&#xff0c;它按照左子树、根节点、右子树的顺序访问每个节点。这种方式…

2024mathorcup妈妈杯数学建模A题思路模型

2024mathorcup妈妈杯数学建模A题思路模型&#xff1a;比赛开始后第一时间更新&#xff0c;更新见文末名片&#xff0c;下面对2022年B题进行介绍&#xff1a; 2022Mathorcup B题题目介绍 ​ B题无人仓的搬运机器人调度问题本题考在无人仓内的仓库管理问题之一&#xff0c;搬运机…

Python 描述符

文章目录 类型&#xff1a;数据描述符&#xff1a;方法描述符&#xff1a;描述符的要包括以下几点:方法描述符实现缓存 描述符(Descriptor)是 Python 中一个非常强大的特性,它允许我们自定义属性的访问行为。使用描述符,我们可以创建一些特殊的属性,在访问这些属性时执行自定义…

机场数据治理系列介绍(5)民用机场智慧能源系统评价体系设计

目录 一、背景 二、体系设计 1、评价体系设计维度 2、评价体系相关约定 3、评价指标体系框架设计 4、能源利用评价指标 5、环境友好评价指标 6、智慧管控评价指标 7、安全保障评价指标 三、具体落地措施 一、背景 在“双碳”国策之下&#xff0c;各类机场将能源系统建…