首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的usleep()实现为忙等待吗?

C中的usleep()实现为忙等待吗?
EN

Stack Overflow用户
提问于 2011-11-17 02:15:57
回答 5查看 30.4K关注 0票数 16

我正在用pthreads构建一个多线程的应用程序,需要一个线程来定期检查一些东西。在这段时间内,这个线程不应该使用任何CPU。使用usleep()可以做到这一点吗?usleep()不忙着等待吗?或者有更好的解决方案?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-17 02:19:50

函数usleep已从SUSv4中删除。您可能应该使用nanosleep或计时器(setitimer等)。

作为R..。注释中的注释,是否应将睡眠实现为忙碌等待:

  • 该线程将继续使用CPU
  • 其他(较低优先级)线程将没有机会运行

因此:

一些定时器可能会使用信号(我想SUSv3提到过SIGALARM?)

  • Some可能会使用奇特的定时器
票数 16
EN

Stack Overflow用户

发布于 2011-11-17 03:33:09

(usleep不是C标准的一部分,而是一个古老的POSIX标准。但请参见下面的内容。)

不,usleep的POSIX规范清楚地说明了

()函数将导致调用线程暂停执行...

因此,这显然要求它暂停执行,并将资源分配给其他进程或线程。

正如其他人已经提到的,POSIX函数nanosleep现在正在取代usleep,您应该使用它。C(从C11开始)有一个模仿nanosleep的函数thrd_sleep

票数 11
EN

Stack Overflow用户

发布于 2011-11-17 05:18:51

只需注意usleep()和nanosleep()都可以被信号中断。nanosleep()允许您传入一个额外的timespec指针,如果发生这种情况,将在该指针中存储剩余时间。因此,如果您确实需要保证延迟时间,那么您可能希望编写一个简单的包装来包装nanosleep()。

请注意,这不是测试,而是以下内容:

代码语言:javascript
复制
int myNanoSleep(time_t sec, long nanosec)
{
   /* Setup timespec */
   struct timespec req;
   req.tv_sec = sec;
   req.tv_nsec = nanosec;

   /* Loop until we've slept long enough */
   do 
   {
      /* Store remainder back on top of the original required time */
      if( 0 != nanosleep( &req, &req ) )
      {
          /* If any error other than a signal interrupt occurs, return an error */
          if(errno != EINTR)
             return -1; 
      }
      else
      {
          /* nanosleep succeeded, so exit the loop */
          break;
      }
   } while( req.tv_sec > 0 || req.tv_nsec > 0 )
   return 0; /* Return success */
}

如果您需要为周期性超时以外的其他原因唤醒线程,请查看条件变量和pthread_cond_timedwait()

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8156603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档