定时器的使用和线程安全

news2024/11/13 19:35:47

       在linux下如果对定时要求不太精确的话,使用alarm()和signal()就行了;

       但是如果想要实现精度较高的定时功能的话,就要使用setitimer函数。

核心api:

int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

调用成功返回0,否则返回-1;

which为定时器类型,setitimer支持3种类型的定时器:

ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。

ITIMER_VIRTUAL: -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。

ITIMER_PROF: 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。

第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。

//下面这两个是八股,要用计时器setitimer()就必须先配好

struct itimerval {
struct timeval it_interval;      //it_interval指定间隔时间
struct timeval it_value;        //it_value指定初始定时时间
};


struct timeval {
long tv_sec;    //秒
long tv_usec;   //微妙
};


//如果只指定it_value,就是实现一次定时
//如果it_value和it_interval都指定,则超时后,系统会重新初始化it_value为it_interval,实现重复定时
//如果两者都清零,则会清除定时器


//tv_sec提供秒级精度,tv_usec提供微秒级精度,以值大的为先,注意1s = 1000000us = 1000ms

//ovalue用来保存先前的值,常设为NULL。

例子:

#include <stdio.h>
 #include <sys/time.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <signal.h>
 
 void call_back(int sig)
 {
     static int count = 1;
     printf("call_back : %d
", count++);
 }
 
 int main(void)
 {
     signal(SIGALRM, call_back);
     struct itimerval new_value;
     memset(&new_value, 0, sizeof(new_value));
 
     new_value.it_interval.tv_sec = 1;   //设置再次定时时间为1S
     new_value.it_interval.tv_usec = 0;
     new_value.it_value.tv_sec = 2;      //设置首次定时时间为2S
     new_value.it_value.tv_usec = 0;
 
     int ret = setitimer(ITIMER_REAL, &new_value, NULL);
     if (0 != ret)
     {
         perror("setitimer");
         exit(-1);
     }
     getchar();
 
     return 0;
 }

线程安全:

定时器死了,死循环就停不了,线程退出不了,还有就是主程序退出时,你的这个线程怎么安全退出。

还有就是实际的延时的问题,线程实际的输出时间比设定的长或者短。 

这里要特别注意一下sleep()和大写的Sleep()还有usleep()的时间单位是不同的,秒,毫秒和微秒

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

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

相关文章

【李宏毅】机器学习-RNN

RNN(Recurrent Neural Network) 为什么需要RNN呢&#xff1f; 举例来说&#xff0c;有一个任务需要识别每个单词代表的含义。在下面的句子中&#xff0c;taipei分别表示目的地和出发地&#xff0c;我们希望神经网络能够在不同的句子中&#xff0c;识别出不同的语义&#xff0c;…

3、排序(order by)与分页(limit)多表查询 -mysql

3、排序与分页&多表查询 -mysql排序与分页一、排序 Order By二、分页 Limit多表查询一、一个案例引发的多表连接2、笛卡尔积&#xff08;或交叉连接&#xff09;的理解二、多表查询分类讲解1、等值连接 vs 非等值连接2、自连接 vs 非自连接3、内连接 vs 外连接三、SQL99语法…

pytorch深度学习实战lesson18

第十八课 卷积层 卷积是深度学习最重要的概念之一&#xff0c;下面来学习和回顾一下卷积的基本概念。 目录 理论部分 从全连接层到卷积层 卷积层 实践部分 理论部分 从全连接层到卷积层 还是从一个例子开始&#xff1a;假设我要对猫和狗进行分类。 假设我用一千二百万像…

3年经验,光靠自动化测试基础,你可能连17k的测试岗都找不到,认清现实.....

相信对于每一个求职者来说都有被面试的经历吧&#xff0c;曾经作为一位测试小白的我&#xff0c;每一次面试过后都会各种吐槽面试官的不是&#xff0c;吐槽HR人事的不足&#xff0c;以及自己的有点没有发挥出来&#xff0c;今天我终于体会了一次面试官的心情.... 起因&#xf…

【夯实Kafka知识体系及基本功】分析一下(Broker)服务的可靠性机制分析「原理篇」

副本机制 分布式系统中&#xff0c;为了提高可靠性&#xff0c;最常用、最有效的策略是“副本机制”&#xff0c;Kafka也不例外。 Kafka 为每个 Partition 维护了一个 AR&#xff08;Assigned Replicas&#xff09;列表&#xff0c;由 ISR&#xff08;In-Sync Replicas&#x…

通过瑞利判据对显微镜物镜进行分辨率研究

摘要 通常可以采用瑞利判据理论表征显微镜的分辨率&#xff0c;瑞利判据是1896年由第三代瑞利男爵约翰威廉斯特拉特(John William Strutt)提出的。该理论认为&#xff0c;当一个艾里图样的中心与另一个艾里图样的第一个最小值重叠时&#xff0c;就可以分辨它们。在这个例子中…

力扣(LeetCode)3. 无重复字符的最长子串(C++)

滑动窗口 设置滑动窗口&#xff0c; lll 维护左窗口 &#xff0c; rrr 维护右窗口 &#xff0c;利用哈希表统计字母出现次数。 遍历字符串 sss &#xff0c;lll 循环右移&#xff0c;每次移动 &#xff0c; lll 指向的字母 s[l]s[l]s[l] 出现次数 。如果窗口内 s[l]s[l]s[l] …

NCMMSC 2021丨长短视频多语种多模态识别挑战赛

比赛背景 2021年第十六届全国人机语音通讯学术会议&#xff08;National Conference on Man-Machine Speech Communication&#xff0c;NCMMSC2021&#xff09;将于2021年10月15-18日在江苏徐州举行。本次会议由中国中文信息学会和中国计算机学会联合主办。 针对本次会议&…

STA -- clock gating check

对于现在design中例化好的icg以及工具插进去的icg&#xff0c;不存在clock gating check的问题&#xff0c;因为clock gating 搞成了一个lib cell&#xff0c;不再是latch加上与门的组合。不过design中除了这些icg&#xff0c;还有一些的clock gating check的出现&#xff0c;这…

写给 Android 开发:从0到1,再从1到N,都离不开 Framework

作为过来人&#xff0c;发现很多学习者和实践者都在 Android Framework上面临着很多的困扰&#xff0c;比如&#xff1a; 工作场景中遇到难题&#xff0c;往往只能靠盲猜和感觉&#xff0c;用临时性的补救措施去掩盖&#xff0c;看似解决了问题&#xff0c;但下次同样的问题又…

Node.js开发、CommondJS 、ES-Module模块化设计

目录 Node.js是什么 基础使用 Node的REPL 全局变量 模块化设计 CommondJS规范 基础使用exports和module.exports require CommondJS优缺点 AMD和CMD规范 ES_Module 基本使用方法 导出 导入 结合使用 默认导出 ES Module解析流程 Node.js是什么 Node与浏览器的对比 在…

两点云求差集和交集

这里两点云的差集指从点云1中删除属于点云2的点得到的点集&#xff0c;并集指既属于点云1又属于点云2的点集。 两点云求差集 基于kd-tree搜索的方法较快速&#xff0c;当然也可以暴力搜索。思路如下&#xff1a; step1 在点云2建立kd-tree&#xff0c;设置容忍误差&#xff0…

UI控件DevExpress WinForm新手指南——如何在应用启动时执行操作

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

RESTful 接口设计

文章目录RESTful 接口设计1.获取所有员工列表2.增加一个员工3.更新员工4.删除员工5.查询单个员工RESTful 接口设计 1.获取所有员工列表 /*** 获取所有员工* 1. 请求路径--确认资源--员工--/employees* 2. 请求方法--get* 3. 请求参数--无* 4. 请求响应--多个员工--List<Em…

苹果iOS App Store上架操作流程

很多开发者在开发完iOS APP、进行内测后&#xff0c;下一步就面临上架App Store&#xff0c;不过也有很多同学对APP上架App Store的流程不太了解&#xff0c;下面我们来说一下iOS APP上架App Store的具体流程&#xff0c;如有未涉及到的部分&#xff0c;大家可以及时咨询&#…

基于微信小程序的学生购电系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

服务端Skynet(二)——消息调度机制

服务端Skynet(二)——消息调度机制 文章目录服务端Skynet(二)——消息调度机制1、提前了解知识1.1、互斥锁&#xff08;mutex lock : **mut**ual **ex**clusion lock&#xff09;1.2、自旋锁&#xff08;spinlock&#xff09;1.3、读写锁&#xff08;readers–writer lock&…

最简单的git图解(多远程仓库)

上一节我们讲了git操作最基本的命令&#xff1a;最简单的git图解&#xff08;最基本命令&#xff09;_jerry_dyy的博客-CSDN博客 这一节我们来讲一下面对多个远程仓库的场景&#xff0c;应该如何来处理。 为什么要有多个远程仓库&#xff1f; 在企业内部开发团队开发过程中&a…

什么是CDN?CDN的技术原理是什么?

什么是CDN&#xff1f; CDN的全称是Content Delivery Network&#xff0c;中文名称“内容分发网络”。其主要原理是在现有网络中增加一层新的网络架构&#xff0c;将源站中的内容发布到不同的网络节点上&#xff0c;使用户可以就近获得所需的内容&#xff0c;从而提高用户访问…

【学习记录】镭神激光雷达与PC机的NTP同步

本文仅用于记录自己在实现镭神C32激光雷达和PC机进行NTP同步时的一些总结。 吐槽在先&#xff0c;镭神的文档写极其不完善&#xff0c;很多都只是提了一句&#xff0c;但并没有完整的说应该具体怎么做。前前后后折腾了三四天&#xff0c;在一知半解的官方技术支持和实验室大佬…