关于sleep函数

关于sleep函数以前很喜欢用sleep和usleep函数来做定时器。确实方便啊。但是昨天在公司用这个函数写了个东西,被说这2个函数最好别在多线程里面使用。然后叫我改一个定时器方案。查看了man文档。发现sleep还真

大家好,又见面了,我是你们的朋友全栈君。

以前很喜欢用sleep和usleep函数来做定时器。确实方便啊。但是昨天在公司用这个函数写了个东西,被说这2个函数最好别在多线程里面使用。然后叫我改一个定时器方案。查看了man文档。发现sleep还真有问题。里面就写得有BUG:

 

BUGS
sleep() may be implemented using SIGALRM; mixing calls to alarm() and sleep() is a bad idea.

       Using longjmp() from a signal handler or modifying the handling of SIGALRM while sleeping will cause undefined results.

 


 

说到了用sleep在多线程的不适合。因为是用的信号驱动来实现的。可能要引起不确定的因素。后来去网上找了下其他的方法,这里把方法贴出来。一个在多线程中比较好的实现是利用的pthread库里面的pthread_cond_timewait()函数来实现。下面贴出来代码。都比较基础。

 1 void thread_sleep(int second)
 2 {
 3      /*  time wait */
 4     struct timespec outtime;
 5     pthread_cond_t cond;
 6     pthread_mutex_t mutex;
 7 
 8     /*  timer init */
 9     pthread_mutex_init(&mutex, NULL); 
10     pthread_cond_init(&cond, NULL);
11 
12     pthread_mutex_lock(&mutex);
13     outtime.tv_sec = time(NULL) + second;  
14     outtime.tv_nsec = 0;
15     pthread_cond_timedwait(&cond, &mutex, &outtime);
16     pthread_mutex_unlock(&mutex);
17 }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155007.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js 判断对象是否为空

    js 判断对象是否为空js判断对象是否为空的四种方法

    2022年5月30日
    40
  • linux之使用samba实现文件共享

    早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据,这样确实不太方便,于是便出现了NFS开源文件共享程序,NFS是一个能够将多台L

    2021年12月28日
    52
  • 转:CCriticalSection「建议收藏」

    转:CCriticalSection「建议收藏」类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只能有一个线程修改数据或其它的控制资源时非常有用。例如在链表中增加一个节点就中允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。在运行性能比较重要而且资源不会跨进程使用时,建议采用临界区代替信号灯。有关在MF…

    2022年7月20日
    15
  • JTAG接口定义与其他简介

    JTAG接口定义与其他简介JTAG接口定义与其他简介JTAG(JointTestActionGroup)是一个接口,为了这个接口成立了一个小组叫JTAG小组,它成立于1985年,比推丸菌的年龄还大。在1990年IEEE觉得一切妥当,于是发布了IEEEStandard1149.1-1990,并命名为StandardTestAccessPortandBoundary-ScanArchitecture…

    2022年6月10日
    73
  • jdk14下载与安装教程(win10)超详细

    jdk14下载与安装教程(win10)超详细一、前言现在jdk已经升级到JDK14版本了,这里也记录一下jdk14的下载及安装过程,对于刚学习java的小伙伴可以参考,熟手可忽略,呵呵~二、下载安装步骤一、首先是去jdk官网下载,官网下载还需要注册,如果大家不怕麻烦的话可以去官网下载,下载速度也是龟速,我也是花了好长时间才下载下来,大家可以点击我的网盘目录jdk目录下载,目录也有其它低版本的,如果有需要大家根据需要自行选择。…

    2022年5月26日
    187
  • vue开发环境搭建(win7)

    vue开发环境搭建(win7)vue开发环境搭建-win71.安装node,js2.设置nodeglobal(全局)和cache(缓存)路径3.配置环境变量4.基于Node.js安装cnpm(淘宝镜像)5.安装vue6.安装vue脚手架vue-cli7.项目创建8.添加相关依赖9.修改端口号10.运行项目1.安装node,js下载node.js安装包:node.js下载官网在这里,我选择…

    2022年8月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号