[c#] Semaphore와 SemaphoreSlim 중에서 어떻게 선택합니까?

그들의 공용 인터페이스는 비슷하게 보입니다. 문서 SemaphoreSlim 경량 대안 및 Windows 커널 세마포어를 사용하지 않는 상태. 이 리소스 는 SemaphoreSlim이 훨씬 빠르다는 것을 나타냅니다. 어떤 상황에서 SemaphoreSlim이 Semaphore보다 더 합리적이고 그 반대의 경우도 마찬가지입니까?



답변

한 가지 차이점은 SemaphoreSlim시스템 전체 일 수있는 명명 된 세마포어를 허용하지 않는다는 것입니다. 이는 SemaphoreSlim을 프로세스 간 동기화에 사용할 수 없음을 의미합니다.

MSDN 설명서 에는 “대기 시간이 매우 짧을 것으로 예상되는”경우 SemSlim을 사용해야한다고 나와 있습니다. 그것은 일반적으로 슬림 버전이 대부분의 트레이드 오프에 대해 더 가볍다는 생각과 잘 어울립니다.


답변

MSDN 문서 에 차이점이 설명되어 있습니다.

한 문장으로 :

  • SemaphoreSlim 클래스는 대기 시간이 매우 짧을 것으로 예상되는 단일 프로세스 내에서 대기하는 데 사용할 수있는 가볍고 빠른 세마포어를 나타냅니다.

답변

SemaphoreSlim은 SpinWait 및 Monitor를 기반으로하므로 잠금을 획득하기 위해 대기하는 스레드는 다른 스레드에 양보하기 전에 잠금을 획득하기 위해 일정 시간 동안 CPU주기를 굽습니다. 그렇지 않은 경우 스레드는 OS가 해당 스레드를 다시 예약하면 시스템이 컨텍스트를 전환하고 (일부 CPU주기를 태워서) 다시 시도 할 수 있도록합니다. 오래 기다리면이 패턴은 상당한 양의 CPU주기를 소모 할 수 있습니다. 따라서 이러한 구현을위한 최상의 시나리오는 대부분의 경우 대기 시간이없고 거의 즉시 잠금을 획득 할 수있는 경우입니다.

Semaphore는 OS 커널의 구현에 의존하므로 잠금을 획득 할 때마다 상당한 CPU주기를 소비하지만 그 후에는 스레드가 잠금을 획득하는 데 필요한만큼 잠자기 만합니다.


답변

“단기”논란에 관하여 :

최소한 SemaphoreSlim MSDN 문서 에는

SemaphoreSlim 클래스는 단일 앱 내 동기화에 권장되는 세마포어입니다.

비고 섹션에서. 같은 섹션에서는 Semaphore와 SemaphoreSlim의 주요 차이점도 설명합니다.

SemaphoreSlim은 Windows 커널 세마포를 사용하지 않는 Semaphore 클래스에 대한 경량 대안입니다. Semaphore 클래스와 달리 SemaphoreSlim 클래스는 명명 된 시스템 세마포를 지원하지 않습니다. 로컬 세마포로만 사용할 수 있습니다.


답변

여기 에서 소스 코드를 살펴 보았는데 이것이 제가 생각 해낸 것입니다.

  1. Semaphore와 SemaphoreSlim은 모두 내부적으로 Win32 네이티브 핸들을 사용하는 WaitHandle에서 파생됩니다. 그래서 둘 다 Dispose ()해야합니다. 따라서 Slim이 가볍다는 생각은 의심 스럽다.

  2. SemaphoreSlim은 내부적으로 SpinWait를 사용하지만 Semaphore는 사용하지 않습니다. 즉, 대기 시간이 길 것으로 예상되는 경우 Semaphore가 CPU를 질식시키지 않는다는 점에서 적어도 더 나은 성능을 발휘해야합니다.


답변