所以我试图研究如何使用多线程,我注意到一些我不太明白的东西。在下一段代码中,看起来 doo() 在 Thread 完成之前开始运行,尽管 foo 与 Thread 相同:static void Main(string[] args){ new Thread(new ThreadStart(foo)).Start(); foo(); doo();}public static void foo(){ Console.WriteLine("1"); Thread.Sleep(3000); Console.WriteLine("2");}public static void doo(){ Console.WriteLine("do");}输出为:1 //线程1 //foo2 //foodo //doo2 //线程假设 doo() 在没有 foo() 的情况下无法开始运行,我们假设最后一个“2”输出来自第一个线程。这怎么可能?尽管 foo() 和 Thread 具有相同的休眠时间,因为它们是相同的函数,但为什么线程(首先执行)是最后一个完成的线程?锁定语句现在,如果我们添加一个 lock 语句,如下所示:static object syncLock = new object();static void Main(string[] args){ new Thread(new ThreadStart(foo)).Start(); foo(); doo();}public static void foo(){ lock (syncLock) { Console.WriteLine("1"); Thread.Sleep(3000); Console.WriteLine("2"); } }public static void doo(){ Console.WriteLine("do");}输出为:1 //线程2 //线程1 //foodo //doo2 //线程现在看起来 doo() 在 foo() 结束之前就开始运行了!这是怎么回事?过程及其背后的逻辑是什么?
1 回答
开心每一天1111
TA贡献1836条经验 获得超13个赞
看,你在这里实际上有两个线程,在主线程和第二个线程(foo())上。在 new Thread(new ThreadStart(foo)) 之后)。开始();执行将从主线程开始,这意味着这个线程(主线程)将尝试调用foo(),即你的“1”,之后,主线程进入睡眠状态,第二个线程star foo(),即第二个线程“1”,秒进入睡眠状态。现在主线程将唤醒并完成作业“2”,“do”,最后一个“2”来自sec线程。这是没有锁定的。
使用锁定,主线程将执行 foo() 并且 sec 将被阻塞(“1”,3sec,“2”),当 foo() 解锁时,这意味着,sec 线程可以调用 foo(),当发生这种情况时,sec 打印“1”广告进入睡眠状态,现在(当 sec 正在睡眠时 CPU 寻找可以执行的线程),因此 CPU 执行主线程并打印“do”,然后 sec 将唤醒并打印“2”。
- 1 回答
- 0 关注
- 132 浏览
添加回答
举报
0/150
提交
取消
