当前位置:  技术问答>linux和unix

usleep 休眠非man描述的微妙而是毫秒级别的!

    来源: 互联网  发布时间:2017-04-26

    本文导语:  centos 5.4 系统。gcc 4.1.2 nanosleep 和 usleep 休眠级别都是毫秒,而不是man描述的纳秒和微妙。。。为什么会这样? | 这个linux是支持的,只是有点点不准确而已。毕竟纳秒单位很小嘛。 ...

centos 5.4 系统。gcc 4.1.2
nanosleep 和 usleep 休眠级别都是毫秒,而不是man描述的纳秒和微妙。。。为什么会这样?

|
这个linux是支持的,只是有点点不准确而已。毕竟纳秒单位很小嘛。

|
你可以写个程序测试, 用nanosleep 去睡 1000*1000*100,肯定是睡100ms左右。

|
nanosleep和usleep的精度都是有限的,一般都在毫秒级别。
关于usleep是这么说的:

The usleep() function will cause the calling thread to be suspended from execution until either the number of real-time microseconds specified by the argument useconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested due to the scheduling of other activity by the system.

Implementations may place limitations on the granularity of timer values. For each interval timer, if the requested timer value requires a finer granularity than the implementation supports, the actual timer value will be rounded up to the next supported value. 

程序的输出最直观了

/*-
 * Copyright (C) mymtom
 *
 * vi:set ts=4 sw=4:
 */
#ifndef lint
static const char rcsid[] = "$Id$";
#endif /* not lint */

/**
 * @file        usleep.c
 * @brief       
 */

#include 

#include 
#include 
#include 

static char *getlongtime(char *buf)
{
        struct tm tms;
        struct timeval tvs;

        gettimeofday(&tvs, NULL);
        tms = *localtime(&tvs.tv_sec);
        strftime(buf, 19 + 1, "%Y-%m-%d %H:%M:%S", &tms);
        sprintf(buf + 19, ".%06d", tvs.tv_usec);
        return buf;
}

int main(int argc, char *argv[])
{
        char buf[26 + 1];

        printf("%sn", getlongtime(buf));

        usleep(5);
        printf("%sn", getlongtime(buf));

        usleep(100 * 1000);
        printf("%sn", getlongtime(buf));

        usleep(200 * 1000);
        printf("%sn", getlongtime(buf));

        usleep(199 * 1000);
        printf("%sn", getlongtime(buf));

        return 0;
}

可能的输出为
2013-09-24 10:12:56.155523
2013-09-24 10:12:56.156604
2013-09-24 10:12:56.257607
2013-09-24 10:12:56.458615
2013-09-24 10:12:56.658604

|


对于Linux这样的分时系统来说,由于进程调度和系统时间中断精度的原因,一个usleep很可能在毫秒以上了。

如果需要微秒级的定时精度,需要使用实时操作系统(比如 VxWorks)

|


在Linux下做不到的

为什么一定需要微秒级的sleep呢,应该可以用别的方法解决的

|
本帖最后由 mymtom 于 2013-09-24 11:40:41 编辑

可以确定的说,在分时系统上,不可能精确地实现微秒级的定时。
楼主应该考虑一下其他的方法。

|
如果你只是需要个非常短延时,写个循环等等啊。如果需要让出cpu也有相关函数的。

|
楼主还是用忙等吧,死循环不停的获取最新时间,看是否流逝了足够的纳秒。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • usleep在多线程中的替代方式
  • 多线程程序中使用usleep的问题
  • .net/c#/asp.net iis7站长之家
  • 关于定时函数usleep的问题,急
  • linux下调用sleep或者usleep函数的CPU线程调度情况?
  • sleep和usleep的疑惑
  • linux系统下usleep()函数使用的问题?
  • usleep 不准确,本来想slepp 50us, 但结果是20ms


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,