Синхронизация потоков: есть ли здесь конфликт? - PullRequest
0 голосов
/ 19 февраля 2012
class Class1
    {
        private static object consoleGate = new Object();

        private static void Trace(string msg)
        {
            lock (consoleGate)
            {
                Console.WriteLine("[{0,3}/{1}]-{2}:{3}", Thread.CurrentThread.ManagedThreadId,
                    Thread.CurrentThread.IsThreadPoolThread ? "pool" : "fore",
                    DateTime.Now.ToString("HH:mm:ss.ffff"), msg);
            }
        }
        private static void ProcessWorkItems()
        {
                    lock (consoleGate)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            Trace("Processing " + i);
                            Thread.Sleep(250);
                        }
                    }
            Console.WriteLine("Terminado.");

        }
        static void Main()
        {
            ProcessWorkItems(); Console.ReadLine();
        }
    }

вывод:

Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Terminated

Почему этот код работает?Статический метод ProcessWorkItems блокирует объект ConsoleGate, и Trace делает то же самое.Я думал, что объект может быть заблокирован только один раз.¿Некоторые объяснения?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2012

блокировки в C # являются повторными - один поток может получить одну и ту же блокировку несколько раз без блокировки.Если у вас есть только один поток, здесь нет проблем - блокировки предназначены для синхронизации доступа к ресурсам между несколькими потоками.

Из документации MSDN в lock:

Ключевое слово lock гарантирует, что один поток не входит в критическую секцию кода, в то время как другой поток находится в критической секции.Если другой поток попытается ввести заблокированный код, он будет ждать блокировки до тех пор, пока объект не будет освобожден.: «Что такое замкнутый круг и концепция в целом?»

1 голос
/ 19 февраля 2012

Весь код, который вы здесь видите, выполняется в том же потоке.Вот почему он работает так же, как если бы вы не использовали «lock»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...