关于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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]

    计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]电脑蓝屏代码现象是我们在使用电脑中最常见的一种启动问题,令小白用户很头痛。比如,我们在启动电脑的时候,它并没有正常地启动,屏幕反而一片蓝色,出现了一串奇怪的代码:0x000000ed,怎么办?下面,小编给大伙演示电脑蓝屏代码0x000000ed的修复流程。电脑蓝屏代码0x000000ed怎么解决蓝屏代码0x000000ed原因分析:一般是由于磁盘存在错误导致的。有可能是电脑非常关机导致系统错误,…

    2022年10月8日
  • 笔记:解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to…

    笔记:解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to…今天重启游戏服务器在连接redis数据库时突然报错:MISCONFRedisisconfiguredtosaveRDBsnapshots,butitiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled,becausethisinstance

    2022年10月25日
  • linux的软连接命令(文件夹建立软连接)

    Linux命令之软连接详解。结合示例详细说明软链接的创建,同时给出如何正确删除一个软链接。

    2022年4月14日
  • mysql优化器不能使用hash索引来加速_数据库主键索引和唯一索引的区别

    mysql优化器不能使用hash索引来加速_数据库主键索引和唯一索引的区别1.hash表只能匹配是否相等,不能实现范围查找select * from xx where id > 23; 这时就没办法索引了2.当需要按照索引进行order by时,hash值没办法支持排序select * from xx order by score desc;如果score为建立索引的字段,hash值没办法辅助排序。3.组合索引可以支持部分索引查询,如(a,b,c)的组合索引,查询中只用到了阿和b也可以查询的,如果使用hash表,组合索引会将几个字段合并hash,没办法支持部分索引

    2022年8月8日
  • 如何安装Windows操作系统

    如何安装Windows操作系统博主喜欢以最原始最直接的方式安装系统,并且不喜欢安装Ghost、精简、修改等等各种操作系统,在这里分享一个一直在用,看起来麻烦博主却觉得最适合个人安装操作系统的方式,请往下看,欢迎指正交流分享一、关于如何选择操作系统这里只说Windows7、Windows8、Windows8.1以及Windows10,博主倾向于在Windows7和Windows10中二选一,有很多同学习…

    2022年6月2日
  • sql server 字符串转日期_sql server 字符串替换

    sql server 字符串转日期_sql server 字符串替换提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档sqlserver字符串转为日期时间格式使用步骤1.引入库2.读入数据总结使用步骤1.引入库代码如下(示例):importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsimportwarningswarnings.filterwarnings(‘ignore’)importsslssl._c

    2022年10月8日

发表回复

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

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