什么时候线程通常会产生?

时间:2013-02-01 20:34:09

标签: multithreading language-agnostic

在大多数语言/框架中,线程有一种方法可以控制其他线程。但是,我真的不能想到从线程中屈服是给定问题的正确解决方案的时候。一般来说,应该使用Thread.yield()sleep(0)等吗?

3 个答案:

答案 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一样。我们过去依赖它来提高程序的性能,因为在很多情况下程序员比编译器更擅长。但现代编译器非常聪明,而且现在编程人员使用registerThread.yield()实际上可以提高程序的性能。