最近工作中需要在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时间设置的更多相关文章

  1. [ASP.NET] 如果将缓存“滑动过期时间”设置为1秒会怎样?

    今天编写了一个采用ASP.NET Caching的组件,在为它编写Unit Test的过程中发现了一个有趣的问题,接下来我通过一个简单的实例说明这个问题.我们在一个控制台应用中编写了如下一段程序,这个 ...

  2. session超时时间设置方法

    session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...

  3. Linux下date命令,格式化输出,时间设置

    date命令的帮助信息 [root@localhost source]# date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] ...

  4. firefox访问失败的时间设置错误问题

    在新装系统, 安装firefox后, 访问网页: baidu时 总是自动将http转换为https, 这个是baidu服务器的设置问题, 怪不到ff bd说,是ocsp证书错误, 然后将ocsp认证q ...

  5. quartz定时任务时间设置

    这些星号由左到右按顺序代表 :     *    *     *     *    *     *   *                                   格式: [秒] [分] ...

  6. quartz定时任务时间设置描述

    这些星号由左到右按顺序代表 : * * * * * * * 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , ...

  7. Quartz 定时器时间设置

    spring定时器的时间设置   时间的配置如下:<value>0 26 16 * * ?</value>    时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年 ...

  8. ggplot2 scale相关设置2—时间设置

    在scale设置中,常用的日期方面的设置函数包括: scale_x_date(),scale_y_date(),scale_x_datetime(),scale_y_datetime()   接下来, ...

  9. quartz 时间设置(定时任务scheduler)

    quartz用来设置定时任务的作业调度程序.在linux的crontab中用到. 格式为: * * * * * * * 其从左到右顺序代表 :[秒] [分] [小时] [日] [月] [周] [年] ...

随机推荐

  1. AES加密和解密

    using System; using System.Security.Cryptography; using System.Text; using System.IO; namespace AES ...

  2. sql 随笔 2015-08-07

    xls 导入数据库 --删除现有数据 DELETE FROM dbo.PhoneList --插入数据 insert into dbo.PhoneList --读取xls数据 ) , as [Enab ...

  3. Android HTTPS(2)HttpURLConnection.getInputStream异常的原因及解决方案

    Common Problems Verifying Server Certificates InputStream in = urlConnection.getInputStream(); getIn ...

  4. java操作office和pdf文件页面列表导出cvs,excel、pdf报表.

    在平常的开发中我们常常遇到不仅仅只是导出excel报表的情况.有时候也需要导出pdf或者CSV报 表.其实原理都差不多.刚开始本来不打算也这篇博客介绍这个的.感觉这篇博客和前面的博客有点雷同.原理基本 ...

  5. 【Todo】Python的工作原理

    参考这篇: http://python.jobbole.com/86086/?from=timeline&isappinstalled=1&nsukey=MWQG%2B7OI4FvdQ ...

  6. hdu 5067 Harry And Dig Machine (状态压缩dp)

    题目链接 bc上的一道题,刚开始想用这个方法做的,因为刚刚做了一个类似的题,但是想到这只是bc的第二题, 以为用bfs水一下就过去了,结果MLE了,因为bfs的队列里的状态太多了,耗内存太厉害. 题意 ...

  7. js案例_下滑列表

    1.HTML布局(使用ul): <body> <ul> <li class="list" id="lis"> <a h ...

  8. mongodb 物理删除数据

    刚开始用mongodb的时候,感觉很好用,速度很快,不过后面就遇到一个问题,数据物理内存一直增加,删除表也不管用. 然后网上找了各种办法,最后发现一个办法管用,就是物理删除存储数据. 操作如下: 1. ...

  9. js之json

    关于json不了解的,请点击:http://www.json.org/json-zh.html json对象的属性必须要用双引号,值为字符串类型也只能使用双引号,例:{"name" ...

  10. HTTP使用BASIC认证的原理及实现方法

    一.   BASIC认证概述 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户 ...