Thread.yield和睡眠

时间:2014-05-14 14:49:31

标签: multithreading sleep yield

我是多线程的新手,我遇到了两个关于使用thread.yield和sleep进行线程调度的问题,其中我无法从我的书中或使用Google搜索找到明确的回答。我将保存所有伪代码或真实代码,因为我认为如果我的假设不正确,我已经理解了可能存在的饥饿问题。

我将在我的问题中引用3个伪线程:

  1. 我的第一个问题是,如果我在我的3个线程之一中调用线程产生或睡眠,是否可以保证CPU在返回到调用yield的线程之前尝试构建并处理其他2个线程?所以基本上是清空队列中的线程,这使得yiealding线程到达队列的最后一个位置?
  2. 我知道yield应该给其他线程运行的机会但是有可能例如在屈服线程之后其他两个线程中的一个尝试运行并且之后它返回到调用yield的原始线程,跳过最后一个线程并没有给它机会运行吗?

    1. 我的第二个问题与第一个问题有关。因此,屈服和睡眠都具有相同的特性,以至于他们都像我在第一个问题中所假设的那样成为队列中的最后一个,或者他们之间是否存在其他差异而睡眠中的睡眠时间?
    2. 如果这些问题没有意义,我的代码中可能存在的问题是,在进入休眠状态的线程之前,它已经解锁了一个互斥体,其中一个其他线程之前尝试过锁定,失败并等待它打开。所以在线程进入休眠状态后,是否保证试图锁定互斥锁的线程会在睡眠线程之前将其锁定?

1 个答案:

答案 0 :(得分:1)

Thread.yield()是线程调度程序的提示,这意味着“嘿,现在我感觉好,如果你让我开始让其他线程运行”。没有保证,这只是一个提示。关于“队列”中线程排序的假设也是不正确的,因为线程调度也是由OS完成的,如果没有额外的线程交互机制,很难预测特定的命令顺序。

Thread.sleep()让当前线程在指定的时间内进入休眠状态,因此第二个问题的答案是 - 不,他们会做不同的事情。