Нашел странный косяк. Код ниже. Нужно раскоментить одну из подлых строчек.
Почему получается такая разница в результатах ?
Что происходит после вызова Pulse ? Т.е. почему после этого вызова второй поток через раз успевает залочить синкрут ?
По идее синкрут после выхода второго должен принадлежать первому потоку и второй не может тут же залочить этот синкрут.
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(Method1);
ThreadPool.QueueUserWorkItem(Method2);
Console.ReadLine();
}
private static void Method1(object state)
{
lock (syncRoot)
{
while (true)
{
Console.WriteLine("1 >");
Monitor.Wait(syncRoot);
Console.WriteLine("1 <");
}
}
}
private static void Method2(object state)
{
while (true)
{
lock (syncRoot)
{
Console.WriteLine("2 >------");
Thread.Sleep(1900);
//Console.WriteLine("2 <"); // подлая строчка, вариант 1
Monitor.Pulse(syncRoot);
//Console.WriteLine("2 <"); // подлая строчка, вариант 2
}
}
}
Вывод
2 >------
2 <
1 <
1 >
2 >------
2 <
2 >------
2 <
1 <
1 >
2 >------
2 <
2 >------
2 <
1 <
1 >
2 >------
2 <
2 >------
1 >
2 >------
2 <
1 <
1 >
2 >------
2 <
1 <
1 >
2 >------
2 <
1 <
1 >
2 >------
2 <
1 <
1 >
2 >------