Разница в использовании и реализации ManualResetEvent (Slim), Semaphore (Slim) и ReaderWriterLock (Slim)
В .net 4.0 было добавлено несколько новых классов, связанных с многопоточностью: ManualResetEventSlim, SemaphoreSlim и ReaderWriterLockSlim.
В чем разница между версиями Slim и старшими классами, и когда я должен использовать одну поверх другой?
Ответы
Ответ 1
ReaderWriterLockSlim
- лучшая версия ReaderWriterLock
, которая быстрее и не страдает от голода писателя
ManualResetEventSlim
и SemaphoreSlim
являются полностью управляемыми версиями ManualResetEvent
и Semaphore
, которые затягиваются на некоторое время, прежде чем возвращаться к объектам ядра и, следовательно, быстрее, чем старые версии, когда время ожидания коротки.
Ответ 2
Вот несколько замечательных иллюстраций, объясняющих "поток" этих примитивов синхронизации. Они могут быть полезны для более конкретного понимания этих терминов (взято из этого блога)
SemaphoreSlim
![enter image description here]()
CountdownEvent
![enter image description here]()
Барьер
![enter image description here]()
ManualResetEventSlim
![enter image description here]()
Ответ 3
Для прямой цитаты из документации
"В .NET Framework версии 4 вы можете использовать класс System.Threading.ManualResetEventSlim для лучшей производительности, когда ожидаемое время ожидания будет очень коротким, а когда событие не пересечет границу процесса"
Ответ 4
ManualResetEventSlim и SemaphoreSlim - это более легкие версии объекта ядра, и они не выделяют объекты ядра, если не вызывается свойство WaitHandle.
Эти типы не блокируются напрямую, когда вызывается Wait, вместо этого они ненадолго вращаются перед блокировкой, если он получает сигнал
Конструктор ManualResetEventSlim может забирать SpinCount для блокировки числа spns перед блокировкой
Оба этих типа поддерживают отмену, когда вы можете передать метод CancellationToken to Wait
СемафорSlim предоставляет свойство CurrentCount, где окна Семафор не
ManualResetEvent имеет свойство IsSet, в котором событие windows не