我正在用pthreads构建一个多线程的应用程序,需要一个线程来定期检查一些东西。在这段时间内,这个线程不应该使用任何CPU。使用usleep()可以做到这一点吗?usleep()不忙着等待吗?或者有更好的解决方案?
发布于 2011-11-17 02:19:50
函数usleep已从SUSv4中删除。您可能应该使用nanosleep或计时器(setitimer等)。
作为R..。注释中的注释,是否应将睡眠实现为忙碌等待:
因此:
一些定时器可能会使用信号(我想SUSv3提到过SIGALARM?)
发布于 2011-11-17 03:33:09
(usleep不是C标准的一部分,而是一个古老的POSIX标准。但请参见下面的内容。)
不,usleep的POSIX规范清楚地说明了
()函数将导致调用线程暂停执行...
因此,这显然要求它暂停执行,并将资源分配给其他进程或线程。
正如其他人已经提到的,POSIX函数nanosleep现在正在取代usleep,您应该使用它。C(从C11开始)有一个模仿nanosleep的函数thrd_sleep。
发布于 2011-11-17 05:18:51
只需注意usleep()和nanosleep()都可以被信号中断。nanosleep()允许您传入一个额外的timespec指针,如果发生这种情况,将在该指针中存储剩余时间。因此,如果您确实需要保证延迟时间,那么您可能希望编写一个简单的包装来包装nanosleep()。
请注意,这不是测试,而是以下内容:
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()。
https://stackoverflow.com/questions/8156603
复制相似问题