다음을 통해 공유


세마포 및 SemaphoreSlim

System.Threading.Semaphore 클래스는 명명된 시스템 전역 세마포나 로컬 세마포를 나타냅니다. 이 클래스는 Win32 세마포 개체 주위의 씬 래퍼입니다. Win32 세마포는 리소스 풀에 대한 액세스를 제어하는 데 사용할 수 있는 계산 세마포입니다.

SemaphoreSlim 클래스는 대기 시간이 매우 짧을 것으로 예상될 경우 단일 프로세스 내에서 대기하는 데 사용할 수 있는 간단하고 빠른 세마포를 나타냅니다. SemaphoreSlim은 CLR(공용 언어 런타임)에서 제공하는 동기화 기본 형식을 가능한 한 많이 사용합니다. 그러나 이 클래스는 다중 세마포에서 대기하기 위해 필요에 따라 초기화가 지연되는 커널 기반 대기 핸들도 제공합니다. 또한 SemaphoreSlim은 취소 토큰은 지원하지만 명명된 세마포나 동기화 대기 핸들은 지원하지 않습니다.

제한된 리소스 관리

스레드는 WaitHandle 클래스에서 상속된 WaitOne 메서드를 호출하여 세마포에 진입합니다. 호출이 반환되면 세마포의 카운트가 감소합니다. 스레드가 진입을 요청하는 데 카운트가 0인 경우 스레드가 블로킹됩니다. 스레드가 Semaphore.Release 메서드를 호출하여 세마포를 해제하면 블로킹된 스레드에 진입할 수 있습니다. 블로킹된 스레드가 세마포에 진입할 때 FIFO(선입선출) 또는 LIFO(후입선출)와 같은 약속된 순서는 없습니다.

스레드는 WaitOne 메서드를 반복 호출하여 세마포에 여러 번 진입할 수 있습니다. 세마포를 해제하려면 스레드가 Release() 메서드 오버로드를 동일한 횟수만큼 호출하거나 Release(Int32) 메서드 오버로드를 호출하여 해제되는 진입 수를 지정할 수 있습니다.

세마포 및 스레드 ID

Semaphore 클래스는 WaitOneRelease 메서드 호출에 스레드 ID를 적용하지 않습니다. 예를 들어, 세마포의 일반적인 사용 시나리오에는 세마포 카운트를 항상 증가시키는 생산자 스레드와 항상 감소시키는 소비자 스레드가 포함됩니다.

프로그래머는 스레드가 세마포를 너무 여러 번 해제하지 않도록 해야 합니다. 예를 들어, 세마포의 최대 카운트가 2이고 스레드 A와 스레드 B가 모두 세마포에 진입한 경우, 스레드 B에서 프로그래밍 오류가 발생하여 Release를 두 번 호출하면 두 번 모두 호출이 성공합니다. 세마포의 카운트가 최대값에 도달하고 스레드 A가 Release를 호출하면 SemaphoreFullException이 throw됩니다.

명명된 세마포

Windows 운영 체제에서는 세마포에 이름을 지정할 수 있습니다. 명명된 세마포는 시스템 전체에서 사용됩니다. 즉, 명명된 세마포가 만들어지면 이 세마포는 모든 프로세스의 모든 스레드에 표시됩니다. 따라서 명명된 세마포는 스레드뿐 아니라 프로세스의 작업을 동기화하는 데 사용될 수 있습니다.

이름을 지정하는 생성자 중 하나를 사용하여 명명된 시스템 세마포를 나타내는 Semaphore 개체를 만들 수 있습니다.

참고참고

명명된 세마포는 시스템 전체에서 사용되므로 같은 이름의 세마포를 나타내는 Semaphore 개체가 여러 개 있을 수 있습니다.생성자 또는 Semaphore.OpenExisting 메서드를 호출할 때마다 새 Semaphore 개체가 만들어집니다.같은 이름을 반복 지정하면 같은 이름의 세마포를 나타내는 여러 개체가 만들어집니다.

명명된 세마포를 사용할 때는 주의해야 합니다. 명명된 세마포는 시스템 전체에서 사용되므로 같은 이름을 사용하는 다른 프로세스에서 세마포에 예기치 않게 진입할 수 있습니다. 같은 컴퓨터에서 실행되는 악의적인 코드가 이것을 서비스 거부 공격의 수단으로 사용할 수 있습니다.

액세스 제어 보안을 통해 명명된 세마포를 나타내는 Semaphore 개체를 보호합니다. 이때 가능하면 System.Security.AccessControl.SemaphoreSecurity 개체를 지정하는 생성자를 사용합니다. Semaphore.SetAccessControl 메서드를 사용하여 액세스 제어 보안을 적용할 수도 있지만 그러면 세마포가 만들어져서 보호될 때까지는 취약한 상태의 창으로 남습니다. 액세스 제어 보안으로 세마포를 보호하면 악의적인 공격을 방지하는 데는 도움이 되지만 의도하지 않은 이름 충돌 문제가 해결되지는 않습니다.

참고 항목

참조

Semaphore

SemaphoreSlim

기타 리소스

스레딩 개체 및 기능