17

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

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

更新:

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

4

3 回答 3

16

pthread_yield

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

睡眠手册页

sleep() 使调用进程休眠,直到秒秒过去或没有被忽略的信号到达。

如果你不想在你的线程中有一个实时延迟并且只想让其他线程做他们的工作,那么 pthread_yield 比睡眠更适合。

于 2009-06-01T22:50:45.197 回答
15

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

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

针对问题更新进行更新: sleep() 和 pthread_yield() 都只影响调用线程。

于 2009-06-01T22:07:58.310 回答
1

sleep(s)获取当前执行线程并将其挂起,直到 s 秒过去(或者它被信号唤醒。)

在更实际的情况下,当您调用 sleep() 时,该线程将停止执行并且只是...等到指定的时间过去。一旦通过,该线程将被放入就绪队列。

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

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

于 2009-06-01T22:08:58.247 回答