转贴:linux下的精确wait


#include  < sys / time.h >
#include 
< stdio.h >
#include 
< time.h >

inline 
double
now()
{
    timeval tv;
    gettimeofday(
& tv,  0 );
    
double  s  =  (tv.tv_sec);
    s 
+=  (1e - 6   *  tv.tv_usec);
    
return  s;
}

inline 
void
wait(
double  sec)
{
    
double  start_time  =  now();

    
const   double  SLEEP_MIN_TIME  =   0.005 ;        
    
    
// 当等待时间>SLEEP_MIN_TIME时,调用nanosleep() API,避免过多占用内存。
    
// nanosleep() API的精度约为200us。
    
    
if (sec  >  SLEEP_MIN_TIME)
    {
        
double  sleep_time  =  sec - SLEEP_MIN_TIME;
        
struct  timespec sleep_;
        
int  seconds  =  static_cast < int > (sleep_time);
        sleep_.tv_sec 
=  seconds;
        sleep_.tv_nsec 
=  static_cast < int > ((sleep_time - seconds) * 1e9);
        nanosleep(
& sleep_,NULL);            
    }

    
// 开始循环取时,判断时间是否到了。
     for (;;)
    {
        
if ((now()  -  start_time)  >  sec)  break ;
    }
}

测试,在2.6内核,迅驰1.6G环境下,精确度大概能到0.00001 s,即10us。
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值