在大多数语言/框架中,线程有一种方法可以控制其他线程。但是,我真的不能想到从线程中屈服是给定问题的正确解决方案的时候。一般来说,应该使用Thread.yield()
,sleep(0)
等吗?
答案 0 :(得分:6)
一个用例可能是测试并发程序,尝试查找显示同步模式中的缺陷的交错。例如在Java中:
增加交错次数的有用技巧,以及 因此,更有效地探索您的程序的状态空间, 是使用
Thread.yield
来鼓励更多的上下文切换 访问共享状态的操作。 (这有效 技术是特定于平台的,因为JVM可以自由处理 THRead.yield作为无操作[JLS 17.9];使用短暂但非零的睡眠 会更慢但更可靠。) - JCIP
从Java的角度来看,同样有趣的是它们的语义没有定义:
Thread.yield
(和Thread.sleep(0)
)的语义未定义 [JLS 17.9]; JVM可以自由地将它们实现为no-ops或对待它们 作为计划提示。特别是,他们不需要具有 Unix系统上的sleep(0)语义在最后输出当前线程 该优先级的运行队列,产生于其他线程 同样的优先级虽然一些JVM以这种方式实现了产量。 - JCIP
这使得它们当然相当不可靠。这是非常具体的Java,但一般来说我认为以下是正确的:
两者都是低级机制,可以用于影响调度顺序。如果这用于实现某种功能,则此功能基于OS调度程序的概率,这似乎是一个相当糟糕的想法。这应该由更高级别的同步构造来管理。
为了测试目的或强制程序进入某种状态,它似乎是一个方便的工具。
答案 1 :(得分:3)
让您的操作系统安排程序为您决定吗?
所以永远不要屈服,永远不要睡觉(0),直到你匹配绝对需要睡眠(0)的情况并将其记录在这里。
同样的上下文切换是很省钱的,所以我不认为很多人想要更多的上下文切换。
答案 2 :(得分:3)
一般情况下,应该使用Thread.yield(),sleep(0)等吗?
这取决于VM是我们正在讨论的线程模型。对我来说,答案是很少,如果有的话。
传统上一些线程模型是非先发制人的,而其他线程模型则不成熟,因此需要Thread.yield()
。
我觉得Thread.yield()
就像在C中使用register
一样。我们过去依赖它来提高程序的性能,因为在很多情况下程序员比编译器更擅长。但现代编译器非常聪明,而且现在编程人员使用register
和Thread.yield()
实际上可以提高程序的性能。