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

Jas*_*ker 6 language-agnostic multithreading

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

Kon*_*che 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调度程序的概率,这似乎是一个相当糟糕的想法.这应该由更高级别的同步构造来管理.

出于测试目的或强制程序进入某种状态,它似乎是一个方便的工具.