为了澄清术语,yield是指线程放弃其时间片的时间。我感兴趣的平台是POSIX线程,但我认为问题是一般性的。
假设我有消费者/生产者模式。如果我想抑制消费者或生产者,哪一个更好,睡眠还是让步?我最感兴趣的是使用这两个函数的效率。
发布于 2010-04-19 23:19:48
编写生产者/消费者代码的“正确”方法是让消费者等待生产者的数据。您可以通过使用同步对象(如Mutex )来实现此目的。使用者将在互斥锁上执行Wait,这会阻止互斥锁执行,直到数据可用。反过来,生产者将在数据可用时向互斥锁发出信号,这将唤醒使用者线程,以便它可以开始处理。这在这两个方面都比sleep更有效:
这就是说,这里是你所要求的收益与睡眠的分析。如果由于某种原因等待输出是不可行的,您可能需要使用这样的方案:
这取决于您正在接收多少流量-如果数据不断地被接收和处理,您可能会考虑做出让步。然而,在大多数情况下,这将导致一个“忙”循环,该循环花费大部分时间不必要地唤醒线程,以检查是否有任何东西准备就绪。
您可能希望休眠一小段时间(可能不到一秒钟,使用usleep),或者更好地使用诸如互斥锁之类的同步对象来通知数据可用。
发布于 2010-04-19 23:29:35
睡眠和收益是不一样的。当调用睡眠时,进程/线程在给定的时间量内将CPU分配给另一个进程/线程。
that将CPU释放给另一个线程,但如果没有其他线程等待CPU,则可能会立即返回。
因此,如果您想要节流,例如,当以固定的时间间隔流式传输数据时,则可以使用睡眠或纳米睡眠功能。
如果需要生产者/消费者之间的同步,您应该使用互斥/条件等待。
发布于 2010-04-19 23:29:04
睡眠而不是让步的一个很好的理由是,当在特定的关键部分有太多的争用时。例如,假设您尝试获取两个锁,并且这两个锁上都存在大量争用。在这里,您可以使用睡眠来采用指数回退。这将允许每次失败的尝试伪随机地后退,以允许其他线程成功。
在这种情况下让步不会有多大帮助,因为随机回退的前景可能会增加线程饥饿不会发生的可能性。
编辑:虽然我知道这不一定是特定于java的。在这一点上,Java的Thread.sleep(0)实现具有与Thread.yield()相同的效果,它更多的是一个风格问题。
https://stackoverflow.com/questions/2668546
复制相似问题