Итак, я попытался изучить, как использовать многопоточность, и заметил кое-что, чего не совсем понимаю.
В следующем фрагменте кода похоже, что 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 // Thread
1 // foo
2 // foo
do // doo
2 // Thread
Предполагая, что doo () не может запускаться без foo() сделано, мы предполагаем, что последний вывод «2» пришел из первого потока.
Как это возможно?Хотя функции foo () и Thread имеют одинаковое время ожидания, поскольку они являются одинаковыми функциями, почему получается, что Thread (который выполняется первым) завершает в последнюю очередь?
Оператор блокировки
Теперь, если мы добавим оператор блокировки, например:
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 // Thread
2 // Thread
1 // foo
do // doo
2 // Thread
Теперь кажется, что doo () запускается до того, как foo () заканчивается!Что здесь происходит?Каков процесс и логика, стоящая за ним?