Pulse + Wait + Console
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.09.12 16:00
Оценка:
Нашел странный косяк. Код ниже. Нужно раскоментить одну из подлых строчек.
Почему получается такая разница в результатах ?
Что происходит после вызова 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 >------
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.