Thread.Sleep(0)未按预期工作

时间:2013-11-08 07:44:29

标签: c# multithreading

我刚开始学习“用C#线程化”。 我在一本书中发现Thread.Sleep(0)立即,自愿放弃线程的当前时间片 将CPU移交给其他线程。

当我写几行代码来测试它时。我没有得到预期的结果。这是我写的代码。

class Program
{
    static void Main(string[] args)
    {
        Thread.CurrentThread.Name = "Thread A(main thread)";

        Thread thread = new Thread(PrintNumber);
        thread.Name = "Thread B";
        thread.Start();

        for (int i = 0; i < 40; i++)
        {
            Console.WriteLine("{0} | i = {1}", Thread.CurrentThread.Name, i);
        }
    }

    void PrintNumber()
    {
        for (int i = 0; i < 40; i++)
        {
            Console.WriteLine("{0} | i = {1}", Thread.CurrentThread.Name, i);

            if (i == 4)
            {
                Thread.Sleep(0);
            }
        }
    }
}

根据我的理解,这将在线程B中打印最多4个,然后它将恢复线程A.下一个线程调度是不可预测的。 但这不会发生。虽然第一次涉及到线程B,但有时它打印最多6个,有时8个意味着完全不可预测。

我对Theread.Sleep(0)的概念是错误的吗?有人可以澄清这个概念吗

2 个答案:

答案 0 :(得分:3)

如果 释放线程的切片,并不意味着你可以预测它的去向 - 它可以转到上的任何进程计算机。特别是,假设您有一台多核机器,另一个线程可能完全由另一个核心提供服务。在显示的代码中,"Thread B"甚至可能在Main的循环附近都没有启动。启动一个线程不是即时的。

很少有Thread.Sleep(0)对您有用的场景,所有这些场景都涉及对线程和内存模型的广泛知识。

答案 1 :(得分:2)

Thread.Yield()确保正在执行的下一个线程不是当前线程。