2011-12-18 3 views
-1

Как говорится в названии, это действительная реализация? Я знаю о проблемах lock, но из-за требований он должен использоваться. Действительно ли этот код действителен?Является ли это допустимой реализацией потоков ожидания/пульсирования?

lock (richTextBox) 
{ 
    Monitor.Wait(richTextBox); 
    richTextBox.AppendText("Text"); 
    Monitor.PulseAll(richTextBox); 
} 
+1

Можете ли вы объяснить более подробно, что «это действительная реализация» означает? Какие проблемы вы подозреваете, что вы вызываете код здесь? Например, «это * компиляция *» является одним из показателей действительного кода. Я уверен, что это * компиляция. Но вы могли бы использовать компилятор, чтобы понять это. Что касается, если он правильно реализует алгоритм, вы пробовали его? Это сработало? С какими проблемами вы столкнулись? –

+1

Я думаю, что люди немного суров с этим вопросом, есть явное непонимание того, как работают мониторы здесь, и это требует исправления. Просьба прокомментировать, когда вы проголосуете. –

+0

Спасибо @ MerlynMorgan-Graham за убедительное описание недостатков этого вопроса. –

ответ

2

Этот код не имеет смысла, потому что каждый поток будет блокировать на Monitor.Wait, и никто никогда не будет выпускать, если какой-либо другой блок кода не вызывает Monitor.PulseAll. Обычно ожидания/импульсы используются в сценариях производителя/потребителя (то есть один или несколько потоков ожидают, что другой поток выполнит какую-либо задачу или предоставит некоторые данные).

Если вы задаетесь вопросом относительно использования инструкции lock, а не: Monitor.Enter/Monitor.Exit, эта часть в порядке.

Согласно статье MSDN:

lock(obj) { ... } 

должны быть такими же, как:

Monitor.Enter(obj); try { ... } finally { Monitor.Exit(obj); } 
+0

Спасибо за ваш вклад. Я просто хотел уточнить, понял ли я концепцию Monitor.Wait/Pulse. Я понимаю, что вы имеете в виду в отношении метода Wait. –

+0

Важно понимать, что когда Monitor.Wait называется блокировкой, она освобождается, тем самым позволяя другим потокам вводить блокировку. Когда вызывается PulseAll, все потоки, которые ранее назывались wait, будут освобождены, но не одновременно, поскольку только один может повторно получить блокировку за раз. Когда другой поток вызывает Pulse/PulseAll, потоки, заблокированные в Wait, переносятся в готовую очередь, но не переустанавливают блокировку и продолжаются до тех пор, пока поток, который сделал импульс, не освободит блокировку (либо путем выхода из блока, либо путем вызова Подождите. –

+0

Между статьей wikipedia о концепции мониторов en.wikipedia.org/wiki/Monitor_%28synchronization%29 и статьей MSDN в классе Monitor: msdn.microsoft.com/en-us/library/system.threading .monitor.aspx вы должны иметь возможность получить достаточно прочное понимание их функции. –

Смежные вопросы