首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程,何时让步与休眠

多线程,何时让步与休眠
EN

Stack Overflow用户
提问于 2010-04-19 23:15:06
回答 4查看 23.6K关注 0票数 15

为了澄清术语,yield是指线程放弃其时间片的时间。我感兴趣的平台是POSIX线程,但我认为问题是一般性的。

假设我有消费者/生产者模式。如果我想抑制消费者或生产者,哪一个更好,睡眠还是让步?我最感兴趣的是使用这两个函数的效率。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-19 23:19:48

编写生产者/消费者代码的“正确”方法是让消费者等待生产者的数据。您可以通过使用同步对象(如Mutex )来实现此目的。使用者将在互斥锁上执行Wait,这会阻止互斥锁执行,直到数据可用。反过来,生产者将在数据可用时向互斥锁发出信号,这将唤醒使用者线程,以便它可以开始处理。这在这两个方面都比sleep更有效:

  • CPU利用率(不会浪费周期)和
  • 运行时(只要数据可用就开始执行,而不是在计划唤醒线程时开始执行)。

这就是说,这里是你所要求的收益与睡眠的分析。如果由于某种原因等待输出是不可行的,您可能需要使用这样的方案:

这取决于您正在接收多少流量-如果数据不断地被接收和处理,您可能会考虑做出让步。然而,在大多数情况下,这将导致一个“忙”循环,该循环花费大部分时间不必要地唤醒线程,以检查是否有任何东西准备就绪。

您可能希望休眠一小段时间(可能不到一秒钟,使用usleep),或者更好地使用诸如互斥锁之类的同步对象来通知数据可用。

票数 12
EN

Stack Overflow用户

发布于 2010-04-19 23:29:35

睡眠和收益是不一样的。当调用睡眠时,进程/线程在给定的时间量内将CPU分配给另一个进程/线程。

that将CPU释放给另一个线程,但如果没有其他线程等待CPU,则可能会立即返回。

因此,如果您想要节流,例如,当以固定的时间间隔流式传输数据时,则可以使用睡眠或纳米睡眠功能。

如果需要生产者/消费者之间的同步,您应该使用互斥/条件等待。

票数 12
EN

Stack Overflow用户

发布于 2010-04-19 23:29:04

睡眠而不是让步的一个很好的理由是,当在特定的关键部分有太多的争用时。例如,假设您尝试获取两个锁,并且这两个锁上都存在大量争用。在这里,您可以使用睡眠来采用指数回退。这将允许每次失败的尝试伪随机地后退,以允许其他线程成功。

在这种情况下让步不会有多大帮助,因为随机回退的前景可能会增加线程饥饿不会发生的可能性。

编辑:虽然我知道这不一定是特定于java的。在这一点上,Java的Thread.sleep(0)实现具有与Thread.yield()相同的效果,它更多的是一个风格问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2668546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档