pthread_cond_timedwait时间设置
最近工作中需要在ACodec中起一个pthread,并每间隔100ms统计一次buffer的状态,在程序中使用pthread_cond_timedwait来设置时间间隔,但在使用中发现当超时时间设置成1秒以下的值时,无法得到想要的效果,具体表现为,没有wait足够的时间就被唤醒,且返回值正确。
查看pthread_cond_timedwait的函数原型:
int pthread_cond_timedwait(pthread_cond_t *cond_interface,
pthread_mutex_t * mutex,
const timespec *abstime)
abstime是一个绝对时间,struct timespce的原型为:
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds */
};
其中tv_sec是秒,tv_nsec是纳秒(即1000,000,000分之一秒).
首先看一下我之前错误的代码:
long timeout_ms = ; // wait time 100ms
struct timespec abstime;
abstime.tv_sec = time(NULL) + timeout_ms / ;
abstime.tv_nsec = (timeout_ms % ) * ;
pthread_cond_timedwait(&cond, &mutex, &abstime);
以上代码有问题,主要是因为time(NULL)的返回结果的精度是秒级的,那么如果当前时间是m秒+n毫秒,那么实际等待的时间只是timeout_ms – n,且还有可能发生n > timeout_ms的情况,这种情形下,如果这段代码处在一处while循环内,则会造成大量的pthread_cond_timedwait系统调用,并造成大量的context switch,系统CPU会占用很高。
正确的代码应该改为如下:
struct timespec abstime;
struct timeval now;
long timeout_ms = ; // wait time 100ms
gettimeofday(&now, NULL);
long nsec = now.tv_usec * + (timeout_ms % ) * ;
abstime.tv_sec=now.tv_sec + nsec / + timeout_ms / ;
abstime.tv_nsec=nsec % ;
pthread_cond_timedwait(&cond, &mutex, &abstime);
通过gettimeofday获得精确到微秒(1000,000分之一秒)的时间数据,并处理不足一秒加上超时时间超过一秒的情况(即tv_sec上需要加上nsec/1000000000)。
pthread_cond_timedwait时间设置的更多相关文章
- [ASP.NET] 如果将缓存“滑动过期时间”设置为1秒会怎样?
今天编写了一个采用ASP.NET Caching的组件,在为它编写Unit Test的过程中发现了一个有趣的问题,接下来我通过一个简单的实例说明这个问题.我们在一个控制台应用中编写了如下一段程序,这个 ...
- session超时时间设置方法
session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...
- Linux下date命令,格式化输出,时间设置
date命令的帮助信息 [root@localhost source]# date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] ...
- firefox访问失败的时间设置错误问题
在新装系统, 安装firefox后, 访问网页: baidu时 总是自动将http转换为https, 这个是baidu服务器的设置问题, 怪不到ff bd说,是ocsp证书错误, 然后将ocsp认证q ...
- quartz定时任务时间设置
这些星号由左到右按顺序代表 : * * * * * * * 格式: [秒] [分] ...
- quartz定时任务时间设置描述
这些星号由左到右按顺序代表 : * * * * * * * 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , ...
- Quartz 定时器时间设置
spring定时器的时间设置 时间的配置如下:<value>0 26 16 * * ?</value> 时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年 ...
- ggplot2 scale相关设置2—时间设置
在scale设置中,常用的日期方面的设置函数包括: scale_x_date(),scale_y_date(),scale_x_datetime(),scale_y_datetime() 接下来, ...
- quartz 时间设置(定时任务scheduler)
quartz用来设置定时任务的作业调度程序.在linux的crontab中用到. 格式为: * * * * * * * 其从左到右顺序代表 :[秒] [分] [小时] [日] [月] [周] [年] ...
随机推荐
- ActiveXObject Word.Application 打印小票
javascript 时间格式 Date.prototype.format = function (format) { var o = { "M+": this.getMonth( ...
- 【Tech】Cassandra安装和启动
1.安装 jre,配置系统环境变量: 2.安装python,配置环境变量: 3.下载cassandra,http://cassandra.apache.org/download/: 4.解压,这里我没 ...
- 【USACO】【Section1.1】Greedy Gift Givers
小白题,也没啥好说的.关键我的算法感觉特别菜的一点是每次要遍历数组从人名找对应的编号,这个效率就很低了.看了ANALYZE里面也是这样的.不过它比我好的一点是我多余设置了initial_money变量 ...
- Eclipse 插件 —— RunJettyRun 的下载、安装与使用
关于 Jetty 与 Eclipse 的集成,网上很多都是使用 Eclipse 的一个自动安装功能 —— Software Update.个人不太喜欢这种方式.这种安装方式有点问题:第一,需要网络流畅 ...
- OpenMp之false sharing
关于false sharing的文章,网上一大堆了,不过觉得都不太系统,那么下面着重系统说明一下. 先看看外国佬下的定义: In symmetric multiprocessor (SMP) syst ...
- URAL1355. Bald Spot Revisited
1355 其实就是求质因子的个数 这样肯定是最多的 注意一下 除到最后不是1的情况 #include <iostream> #include<cstdio> #include& ...
- 创建xml时,设置xml编码问题
OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); XMLW ...
- 使用Aspose.Cells组件生成Excel文件
生成带表头的Excel文件,格式如下显示. 当然更复杂的一些也可以通过 合并单元格的方法 public void Merge(int firstRow, int firstColumn, int to ...
- HDU 4006 The kth great number【优先队列】
题意:输入n行,k,如果一行以I开头,那么插入x,如果以Q开头,则输出第k大的数 用优先队列来做,将队列的大小维护在k这么大,然后每次取队首元素就可以了 另外这个维护队列只有k个元素的时候需要注意一下 ...
- volley(5) 参数total_remain:totalqty, data:[{ bar_status:XX , bar_code: "XX",bar_remain:XX, bar_whcode:"XX" , bar_prodcode:"XX",bar_id:XX,bar_location: "XX", pr_detail: "XX" , bar_batchcode:method:POST
1. 来源 : WHCombineBatchFragment.java 2. 部分代码 WHCombineBatchFragmentCombineBtnClickEvent whc2;private ...