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

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

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

更新:

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

来自pthread_yield :

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

从睡眠手册页 :

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

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

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

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

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

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

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

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

我将出去讨论并说sleep(0)将完成与pthread_yield()相同的事情 – 停止执行并将线程放在就绪队列中。