【问题标题】:Thread.Sleep(0) vs Thread.Sleep(1) vs Thread.Sleep(2)Thread.Sleep(0) 与 Thread.Sleep(1) 与 Thread.Sleep(2)
【发布时间】:2020-03-14 13:04:22
【问题描述】:

如果我没记错的话,Thread.Sleep(0) 会将调用线程的时间片让给任何其他优先级等于或高于调用线程的线程,而Thread.Sleep(any number larger than zero) 会将其让给任何等待线程.

现在,在我的脑海中盘旋的是,在 C# 3 或 4 之前,Thread.Sleep(0) 将只放弃更高优先级的线程,Thread.Sleep(1) 将放弃更高优先级或相同优先级,Thread.Sleep(2)任何优先级。我说的对吗?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    Thread.Sleep(n); // Where n is milliseconds

    当 N==0

    这告诉系统您要放弃线程的剩余时间片,并让另一个等待线程(其优先级 >= currentThread)运行(这意味着您无法确定何时重新获得控制权)。
    如果没有其他同等优先级的线程可以运行,则不会暂停当前线程的执行。

    当 N>=1(无论是 N=1 还是 N=2)

    将阻塞当前线程至少在 n 毫秒内可能发生的时间片(或线程量子)数量,换句话说,它将放弃其时间片的剩余部分给任何其他线程无条件地。

    Windows 线程调度程序确保每个线程(至少具有相同优先级的线程)将获得公平的 CPU 时间来执行。将当前线程阻塞至少指定时间间隔的原因是调度程序在再次到达该线程之前可能需要比指定时间间隔更长的时间。

    参考:123


    更新

    在寻找 C# 3 之前的版本中 Sleep 的工作原理的过程中,我遇到了一些有趣的文章(在 2005 年及之前),我觉得值得更新。 p>

    简而言之,当 n=1 或 n=2 时,我没有发现线程放弃更高或相同优先级的任何区别。

    来自金库: 123

    【讨论】:

    • 小心,“线程量子”在 Windows 上意味着非常不同的东西。例如,对于拥有前台窗口的线程,工作站版本上的 3 个滴答声。只要它可以在被抢先关闭之前运行。 Thread.Sleep() 具有刻度精度。
    • 谢谢,但您知道过去是否有所不同吗?特别是在 C# 3 之前?
    • 嘿@J.Doe,我一直在挖掘旧的保险库以验证您的查询,从我收集的信息来看,我没有发现任何不同。让我用我的发现更新答案
    猜你喜欢
    • 2010-11-27
    • 2013-04-28
    • 2012-03-24
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多