• 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。

    版权所有,欢迎转载
  • 相关阅读:
    Docker 使用Calico插件配置网络
    Fluentd插件rewrite-tag-filter介绍
    Fluentd Regexp patterns
    gdb 打印数据结构
    g++ -g
    《100-gdb-tips》——查看调用堆栈
    dbghelp.dll 定位异常奔溃信息
    debug skill:烫烫烫屯屯屯
    sizeof()和strlen()的区别
    指针和引用的区别
  • 原文地址:https://www.cnblogs.com/xiaotie/p/325771.html
Copyright © 2020-2023  润新知