【发布时间】:2017-10-18 09:49:12
【问题描述】:
我测试简单的代码
static Thread _readThread = null;
static private Object thisLock = new Object();
static int a = 1;
private static void ReadComPort()
{
lock (thisLock)
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine(Thread.CurrentThread.Name + " " + a++.ToString());
Thread.Sleep(1000);
}
}
}
static void Main(string[] args)
{
for (int i = 0; i < 3; i++)
{
_readThread = new Thread(new ThreadStart(ReadComPort));
_readThread.IsBackground = true;
_readThread.Name = i.ToString();
_readThread.Start();
//Thread.Sleep(50);
}
Console.WriteLine("End");
Console.ReadKey();
}
但是为什么执行顺序和线程启动是混乱的: 0,2,1 为什么?
控制台输出:
0 1
End
0 2
0 3
2 4
2 5
2 6
1 7
1 8
1 9
【问题讨论】:
-
您期待和为什么?请注意,您的低迭代次数意味着 线程之间的任何交互都不太可能发生。
-
当一个线程启动时,它不保证立即运行,也不保证与其他线程相比按启动顺序运行
-
你可以使用
Task.ContinueWith,队列来运行线程,队列/优先级来同步对控制台的访问,还有什么......应该更多,但绝对不要运行一些线程并期望它们将自己组织为你没有告诉他们... -
好吧,你不希望超过 1 个线程拉你的 ComPort。
标签: c# multithreading locking