Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Monitor.Enter/Monitor.Exit


Автор: Idsa 8.8.2008, 10:24
Мне необходимо заблокировать синхронизационную переменную в одном потоке, а разблокировать - в другом. Насколько я понял, класс Monitor не предназначен для этого (ругается SynchronizationLockException'ом). Как тогда быть? Использовать тяжеловесные объекты ядра?

Автор: Partizan 8.8.2008, 10:55
Idsa, эээ...а можете привести конкретную ситуацию, когда такое поведение является желаемым?...

Автор: Idsa 8.8.2008, 11:01
Цитата(Partizan @  8.8.2008,  14:55 Найти цитируемый пост)
Idsa, эээ...а можете привести конкретную ситуацию, когда такое поведение является желаемым?... 

Это секрет государственной важности :-P
А вообще, что такого дикого в таком поведении? Общий случай: 1. есть много ресурсов, доступ к которым необходимо разрешать/запрещать по определенной логике 2. один из потоков, дойдя до определенной стадии, разрешает доступ к какому-либо ресурсу.

Автор: Partizan 8.8.2008, 11:26
Idsa, похоже здесь больше подойдёт использование мьютексов / семафоров (нужное подчеркнуть)

Автор: Idsa 9.8.2008, 10:56
Цитата(Partizan @  8.8.2008,  15:26 Найти цитируемый пост)
Idsa, похоже здесь больше подойдёт использование мьютексов / семафоров (нужное подчеркнуть) 

Оказывается, несмотря на кросс-процессную область видимости Mutex'а (Monitor может использоваться только в пределах одного AppDomain), на него, как и на Monitor, распространяется ограничение "в этом потоке заблокировал, в этом же будь добр и разблокировать". К счастью, Semaphore лишен этого ограничения. Так что единственный выход в моей ситуации - использовать одноместный Semaphore. Что я, в общем-то, и сделал smile
Вот отличная статья по multythreading'у: http://www.albahari.com/threading/part2.html Мне она понравилась даже больше, чем мануал Рихтера.
Вот выдержки из этой статьи, подтвержающие мои слова:
1. Про Mutex:
Цитата

Just like with C#'s lock statement, a Mutex can only be released from the same thread that obtained it.

2. Про Semaphore:
Цитата

A Semaphore with a capacity of one is similar to a Mutex or lock, except that the Semaphore has no "owner" – it's thread-agnostic. Any thread can call Release on a Semaphore, while with Mutex and lock, only the thread that obtained the resource can release it.


Добавлено через 2 минуты и 47 секунд
Цитата(Partizan @  8.8.2008,  14:55 Найти цитируемый пост)
Idsa, эээ...а можете привести конкретную ситуацию, когда такое поведение является желаемым?... 

Нашел красивую формулировку ответа на этот вопрос: для упорядочивания обращений к совместно используемым ресурсами smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)