linux下的usleep

本文通过编写测试代码来验证使用usleep()函数实现微秒级延时的效果,发现实际执行结果存在较大偏差,与预期时间不符。进一步探讨了原因并尝试在ARM平台上进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sleep()是以秒为单位的,要想延迟一个较小的时间,就需要用到usleep()。

另外还有个nanosleep(),用法好像很复杂。

 usleep可能很难保证时间精度。我写了一段测试代码

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

int main(void)
{
    int i;
    struct timeval tvTotal;
    struct timeval tvBegin, tvEnd, tvSub;

    tvTotal.tv_sec = 0;
    tvTotal.tv_usec = 0;
    for (i = 0; i < 100; i++) 
    {
        gettimeofday(&tvBegin, NULL);
        usleep(1000);     // 1000 us(microsecond/微秒) = 1 ms(毫秒) 
        gettimeofday(&tvEnd, NULL);
        timersub(&tvEnd, &tvBegin, &tvSub);
        tvTotal.tv_sec += tvSub.tv_sec;
        tvTotal.tv_usec += tvSub.tv_usec;
        printf("%d\n", tvSub.tv_usec);
    }
    printf("try to usleep 1000 us 100 times, average of result is: %ld\n", tvTotal.tv_sec*1000*10+tvTotal.tv_usec/100);
    return   0;
}


在虚拟机上运行的结果,证实偏差很大:
[root@localhost ~]# ./test
1118
1700
1855
3428
2148
3097
1347
1339
1800
1837
4322
4228
8866
1343
1902
1816
2353
1238
2065
1347
1775
1717
1924
2142
3011
1945
3078
6542
1918
2647
1780
2507
2447
4542
3574
8839
2014
1503
1240
1844
1993
1903
1936
1498
1798
1357
2882
7804
1234
1323
2404
1410
1972
1909
2066
1901
1371
2113
1477
1477
1403
6248
1691
2539
2005
1303
1940
1975
1983
2167
2021
1484
1460
2364
5229
1890
1193
2132
1894
1876
1973
2120
1844
1949
1407
1727
2186
1872
1900
7160
1703
1971
1243
1495
1861
2017
1223
1125
1733
1498
try to usleep 1000 us 100 times, average of result is: 2327

抖动非常厉害。
明天找个arm板在测测看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值