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

Tre*_*ith 14 c multithreading sleep yield pthreads

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

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

更新:

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

lot*_*har 15

来自pthread_yield:

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

睡眠手册页:

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

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

  • 更确切地说:`sleep()`总是从内核的runqueue中删除线程,并向waitqueue添加一个任务,一旦休眠时间结束,该任务就会将线程放回runqueue.另一方面,`sched_yield()`只是将线程从活动的runqueue移动到过期的runqueue.所以即使`sleep(0)`与`sched_yield`不同(并且不像人们想象的那样是无操作). (12认同)

JSB*_*ոգչ 14

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

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

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