为什么Thread.Sleep同步线程?

时间:2016-06-04 08:58:44

标签: c# multithreading

为什么没有Thread.Sleep线程将异步工作(1),并且同步(2)?

enter image description here

class A
{
    static object locker = new object();

    static void M0()
    {
        for(int i = 0; i < 5; i++)
            lock (locker)
            {
                Console.WriteLine("Secondary");
                //Thread.Sleep(100);
            }    
    }

    static void Main()
    {
        ThreadStart ts = new ThreadStart(M0);
        Thread t = new Thread(ts);
        t.Start();

        for (int i = 0; i < 5; i++)
            lock (locker)
            {
                Console.WriteLine("Primary");
                //Thread.Sleep(100);
            }
    }
}

1 个答案:

答案 0 :(得分:5)

两种方式都是异步工作的,毕竟你有2个线程。

当您启动线程并且没有睡眠时,它执行得如此之快,以至于它设法在其分配的时间片内输出5 Secondary行。

Sleep调用减慢了一切,因为你正在睡眠一段相当大的时间(与线程时间片相比),它会让线程的外观一步一步地运行。

然而,这只是运气。没有什么可以阻止线程调度程序在它进入M0之前决定暂停lock一段时间,该时间段允许主线程完全执行其循环。