КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Pulse и WaitMonitor.Wait - Освобождает блокировку объекта и блокирует текущий поток до тех пор, пока тот не получит блокировку снова. Monitor.Pulse - уведомляет поток в очереди готовности об изменении состояния объекта с блокировкой. Только текущий владелец блокировки может послать сигнал ожидающему объекту, используя Pulse. Поток, который в данный момент владеет блокировкой указанного объекта, вызывает этот метод для сообщения следующему в очереди потоку о блокировке. При получении импульса ожидающий поток перемещается в очередь готовности. Когда поток, вызвавший метод Pulse, освобождает блокировку, следующий поток в очереди готовности (который необязательно является потоком, получившим импульс) получает блокировку. Класс Monitor не поддерживает состояние, указывающее, что метод Pulse не вызывался. Таким образом, если вызывается Pulse, когда нет потоков в ожидании, следующий поток вызывает блоки Wait, как если бы Pulse никогда не вызывались. Если два потока используют Pulse и Wait, чтобы взаимодействовать, это может привести их к взаимоблокировке. Синхронизированный объект имеет несколько ссылок, в том числе ссылку на поток, удерживающий блокировку в настоящее время, ссылку на очередь готовности, в которой находятся потоки, готовые к получению блокировки, и ссылку на очередь ожидания, в которой находятся потоки, ожидающие уведомления об изменении состояния объекта. Методы Pulse, PulseAll и Wait должны быть вызваны из синхронизированного блока кода. Для сигнализации нескольких потоков используется метод PulseAll.
======================================================================== Чтобы предотвратить повреждение ресурса по причине одновременного доступа многих потоков, нужно использовать конструкции синхронизации потоков. При построении повторно используемой библиотеки классов нужно позаботиться, чтобы все статические методы типов обеспечивали безопасность потоков, то есть чтобы при одновременном вызове несколькими потоками статического метода типа состояние типа не повреждалось. Для этого нужно использовать одну из конструкций синхронизации потоков. Обеспечивать безопасность потоков при работе статических методов в многопоточной среде обязательно, потому что пользователи классов просто не в состоянии реализовать это в своем коде. Представьте, что статический метод Load одновременно пытаются вызвать код библиотечной сборки этой сборки и другой код в исполняемой сборке. Обеим сборкам придется согласовать используемую конструкцию синхронизации потока, и они обе должны «уметь» обнаруживать ее. С другой стороны, библиотека повторно используемых классов не обязана обеспечивать безопасность потоков во всех экземплярных методах типа. Причина в том, что обеспечение безопасности работы с потоками замедляет работу методов, а большинство объектов используется одним потоком; обеспечение безопасности потоками значительно ударит по производительности. Кроме того, когда код создает объект, ни у какого другого кода нет доступа к этому объекту, если только ссылка на него каким-то образом не передана в этот код. Любой код, передающий ссылку на объект, может также передавать информацию о конструкции синхронизации потоков, чтобы код, исполняемый другими потоками, мог обратиться к объекту, обеспечивая безопасность потоков.
|