轉貼:linux下的精確wait

來源:互聯網
上載者:User
#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。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.