【发布时间】:2019-02-02 22:46:58
【问题描述】:
所以我尝试研究如何使用多线程,但我注意到了一些我不太明白的东西。
在下一段代码中,doo() 似乎在线程完成之前开始运行,尽管 foo 与线程相同:
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 //foo
2 //foo
做 //doo
2 //线程
假设 doo() 不能在没有 foo() 的情况下开始运行,我们假设最后的“2”输出来自第一个线程。
这怎么可能?虽然 foo() 和 Thread 是相同的函数,所以睡眠时间相同,但为什么 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 //foo
做 //doo
2 //线程
现在看来 doo() 在 foo() 结束之前就开始运行了!这里发生了什么?其过程和背后的逻辑是什么?
【问题讨论】:
-
no ... 前 1 和 2 来自 foo 而不是线程
-
不要忘记控制台写入是“缓存的”。
-
@Selvin 为什么?
-
@J.vanLangen “缓存”是什么意思?
-
Console.Out.Flush()
标签: c# multithreading thread-sleep