我正在使用pthreads
构建一个多线程应用程序,并需要一个线程定期检查一些内容。在此期间,该线程不应使用任何CPU资源。使用usleep()
函数可以实现吗? usleep()
是否会进行忙等待?还是有更好的解决方案?
usleep
函数已从SUSv4中删除。你应该使用nanosleep
或者计时器(setitimer
,等)。
正如R..在评论中指出的那样,如果将休眠实现为忙等待:
因此:
kernel.org
提到它不在SUSv4中。在SUSv4中搜索它没有结果。 - cnicutar(usleep
不是C标准的一部分,而是古老的POSIX标准的一部分。但请参见下文。)
不,usleep
的POSIX规范明确指出
usleep()函数将导致调用线程暂停执行...
因此,这显然需要它暂停执行并让资源给其他进程或线程。
正如其他人已经提到的,POSIX函数nanosleep
现在正在取代usleep
,你应该使用它。C(自C11)有一个函数thrd_sleep
,它是模拟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()
。
usleep(1)
的调用被转换为nanosleep({0, 1000}, NULL)
。请注意,HTML标签已保留,请勿进行任何更改。usleep()
是一个基于系统计时器构建的C运行库函数。
nanosleep()
是一个系统调用。
仅MS-DOS和类似的操作系统将sleep函数实现为繁忙等待。任何实际提供多任务处理的操作系统都可以通过协调任务和进程的机制轻松提供睡眠功能。
yield()
功能可能会很有用。 - Kerrek SBusleep
与C语言无关,它是操作系统的一个功能。 - Jens Gustedtpthread_yield
不会降低 CPU 使用率,它只会导致线程相对于同一优先级级别的其他线程被暂时降低优先级。 - Dietrich Epp