sem_timedwait 等待时间小于1s时的精确性

源代码:

 sem_t set;

 set_init(&sem,0,0);

 int i = 0;

 while(i < 100)

 {

       struct timespec ts;

       ts.tv_sec = time();

       ts.tv_nsec = 998*1000*1000;

       sem_timedwait(&sem,&ts);

 }

原意:函数循环100次,每次等待998ms。结果:函数瞬间结束

 

原因分析:

按照man 的解释使用sem_timedwait,用time()取时间,原以为是set_timedwait的精确性有问题,看来是冤枉它了。

time()函数返回当前绝对时间的秒级数据。

1、假设第一次循环之前绝对时间为1s990ms,则函数等待到1s998ms。等待时间为9ms。

     第二次设置时间:秒数仍为1s,而微秒级为998ms,这个时间已经在第一次循环到了,则函数不等待立即返回。

     以后98次相同。(统计以后的99次只运行了不到1ms,可见计算机的速度)

2、假设第一次循环之前绝对时间为1s999ms,则时间已经过了,函数不等到立即返回。

     可能以后的某个循环秒设置为2,再等待到998ms。不过这时等待时间已经不准确

 

解决方法:得到当前精确的时间,本函数可以精确到1毫秒,不过对于大部分应用已经足够了,呵呵

 sem_t set;

 set_init(&sem,0,0);

 int i = 0;

 while(i < 100)

 {

       struct timespec ts;

       struct timeval tt;

       gettimeofday(&tt,NULL);

 

       ts.tv_sec = tt.tv_sec;

       ts.tv_nsec = tt.tv_usec*1000 + x * 1000 * 1000;//这里可能造成纳秒>1000 000 000

       ts.tv_sec += ts.tv_nsec/(1000 * 1000 *1000);

       ts.tv_nsec %= (1000 * 1000 *1000);

 

       sem_timedwait(&sem,&ts);

       i++;

 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值