Pthread - time.h :: sleep()和pthread.h :: pthread_yield()之间有什么区别?

时间:2009-06-01 21:54:17

标签: c multithreading pthreads sleep yield

我花了很长时间寻找有关time.h :: sleep()和pthread.h :: pthread_yield()之间差异的信息,但无法找到任何可靠的参考资料,所以我发布了这个问题。

time.h :: sleep()和pthread.h :: pthread_yield()有什么区别?

更新

我问的原因是因为我正在使用sleep()来睡眠()每个单独的线程......当我有8个线程和4个线程时,我的应用程序开始出现问题。当我上网查看sleep()是否只影响每个线程时,我找不到任何好的引用来说明Sleep()是否影响整个进程或者sleep()只影响单个线程。

3 个答案:

答案 0 :(得分:15)

来自pthread_yield

  

pthread_yield子例程强制调用线程放弃对其处理器的使用,并在再次调度之前在运行队列中等待。如果在调用pthread_yield子例程时运行队列为空,则会立即重新调度调用线程。

来自sleep manpage

  

sleep()使调用进程休眠直到秒秒或信号到达且不被忽略。

如果您不想在线程中实时延迟并且只是想让其他线程完成其工作,那么pthread_yield比睡眠更适合。

答案 1 :(得分:13)

sleep()会导致程序停止执行一段时间。无论系统上发生了什么,您的线程都不会再次启动,直到至少经过sleep()的时间已过去。 pthread_yield()通知操作系统您的线程已完成工作,并且它可以将执行切换到另一个线程。但是,如果当时没有更高优先级的线程需要工作,您的线程可能会立即重新启动。

IOWs,在sleep()之后,即使没有其他人需要运行,你的线程也会保证停止运行,而pthread_yield()只是一种礼貌的方式,可以让其他线程有机会在需要的时候运行。

更新以响应问题更新:sleep()和pthread_yield()都只影响调用线程。

答案 2 :(得分:1)

sleep(s)获取当前执行的线程并暂停它直到s秒过去(或者被信号唤醒。)

在更实际的术语中,当你调用sleep()时,该线程将停止执行并且......等待指定的时间过去。一旦通过,该线程就会被放入就绪队列。

pthread_yield()说“抓住这个帖子,把它放到准备好的队列中。”您的线程将停止执行并处于“等待”状态,以便由调度程序选择/运行。这并不保证您的线程不会立即恢复运行。但是它让另一个线程有机会在执行的给定点运行。

我将要说明睡眠(0)将完成与pthread_yield()相同的事情 - 停止执行并将线程放入就绪队列。