Как выбрать между Семафор и СемафорСлим?

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

По крайней мере Документация MSDN для SemaphoreSlim указывает, что

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

в разделе "Примечания". В том же разделе также указано основное различие между Семафор и СемафорСлим:

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

Ответ 4

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

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