Как выбрать между Semaphore и SemaphoreSlim? - PullRequest
96 голосов
/ 11 ноября 2010

Их открытые интерфейсы выглядят похоже.Документация гласит, что SemaphoreSlim является легкой альтернативой и не использует семафоры ядра Windows. Этот ресурс утверждает, что SemaphoreSlim намного быстрее.В каких ситуациях SemaphoreSlim имеет больше смысла, чем семафор и наоборот?

Ответы [ 5 ]

59 голосов
/ 11 ноября 2010

Одно отличие состоит в том, что SemaphoreSlim не разрешает именованные семафоры, которые могут быть общесистемными. Это будет означать, что SemaphoreSlim нельзя использовать для межпроцессной синхронизации.

В документации MSDN также указано, что SemSlim следует использовать, когда «время ожидания, как ожидается, будет очень коротким». Обычно это хорошо согласуется с идеей, что тонкая версия является более легкой для большинства компромиссов.

16 голосов
/ 11 ноября 2010

Документация MSDN описывает разницу.

В одном предложении:

  • Класс SemaphoreSlim представляет собой легкий, быстрый семафор, который можно использовать для ожидания в одном процессе, когда ожидается, что время ожидания будет очень коротким.
11 голосов
/ 24 мая 2016

SemaphoreSlim основан на SpinWait и Monitor, поэтому поток, ожидающий получения блокировки, некоторое время записывает циклы ЦП в надежде получить блокировку перед передачей другому потоку.Если этого не происходит, то потоки позволяют системам переключать контекст и пытаются снова (путем записи некоторых циклов ЦП), как только ОС снова планирует этот поток.При долгом ожидании этот шаблон может прожечь значительное количество циклов ЦП.Таким образом, лучший вариант для такой реализации - это когда в большинстве случаев нет времени ожидания, и вы можете почти мгновенно получить блокировку.

Семафор опирается на реализацию в ядре ОС, поэтому каждый раз, когда вы получаетеБлокировка, вы тратите довольно много циклов ЦП, но после этого поток просто спит столько, сколько необходимо для получения блокировки.

8 голосов
/ 01 апреля 2015

Относительно противоречий "коротких времен":

Как минимум В документации MSDN SemaphoreSlim говорится, что

Класс SemaphoreSlim является рекомендуемым семафором для синхронизации в пределах одногоприложение.

в разделе «Примечания».В этом же разделе рассказывается об основном различии между Semaphore и SemaphoreSlim:

SemaphoreSlim - это легкая альтернатива классу Semaphore, который не использует семафоры ядра Windows.В отличие от класса Semaphore, класс SemaphoreSlim не поддерживает именованные системные семафоры.Вы можете использовать его как локальный семафор.

0 голосов
/ 17 апреля 2018

Я посмотрел исходный код здесь , и вот что я придумал:

  1. И Semaphore, и SemaphoreSlim являются производными от WaitHandle, которая внутренне использует собственный дескриптор Win32,Вот почему вам нужно Dispose () оба.Таким образом, представление о том, что Slim является легким, вызывает подозрение.

  2. SemaphoreSlim использует SpinWait для внутреннего использования, а Semaphore - нет.Это говорит мне о том, что в тех случаях, когда ожидание будет долгим, Semaphore должен работать лучше, по крайней мере, в том смысле, что он не заглушит ваш процессор.

...