Brian McFarl..
6
请注意,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().