내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Semaphore 클래스

2013-12-13

리소스 또는 리소스 풀에 동시에 액세스할 수 있는 스레드 수를 제한합니다.

Namespace:  System.Threading
어셈블리:  System(System.dll)

public sealed class Semaphore : WaitHandle

Semaphore 형식에서는 다음과 같은 멤버를 노출합니다.

  이름설명
Public 메서드Semaphore(Int32, Int32)동시 엔트리의 최대 수를 지정하고, 선택적으로 일부 엔트리를 예약하여 Semaphore 클래스의 새 인스턴스를 초기화합니다.
Public 메서드Semaphore(Int32, Int32, String)보안 중요 동시 엔트리의 최대 개수를 지정하고, 선택적으로 호출한 스레드에 일부 엔트리를 예약하고, 선택적으로 시스템 세마포 개체의 이름을 지정하여 Semaphore 클래스의 새 인스턴스를 초기화합니다.
Public 메서드Semaphore(Int32, Int32, String, Boolean)보안 중요 동시 엔트리의 최대 개수를 지정하고, 선택적으로 호출한 스레드에 일부 엔트리를 예약하고, 선택적으로 시스템 세마포 개체의 이름을 지정하고, 새 시스템 세마포가 만들어졌는지 여부를 나타내는 값을 받을 변수를 지정하여 Semaphore 클래스의 새 인스턴스를 초기화합니다.
맨 위

  이름설명
Public 속성SafeWaitHandle네이티브 운영 체제 핸들을 가져오거나 설정합니다. (WaitHandle에서 상속됨)
맨 위

  이름설명
Public 메서드Close파생 클래스에서 재정의될 때 현재 WaitHandle에서 보유한 모든 리소스를 해제합니다. (WaitHandle에서 상속됨)
Public 메서드Dispose()WaitHandle 클래스의 현재 인스턴스에서 사용하는 모든 리소스를 해제합니다. (WaitHandle에서 상속됨)
Protected 메서드Dispose(Boolean)파생 클래스에서 재정의된 경우 WaitHandle에서 사용하는 관리되지 않는 리소스를 해제하고 필요에 따라 관리되는 리소스를 해제합니다. (WaitHandle에서 상속됨)
Public 메서드Equals(Object)지정한 Object가 현재 Object와 같은지 확인합니다. (Object에서 상속됨)
Protected 메서드Finalize가비지 수집기에서 Object를 회수하기 전에 개체가 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)
Public 메서드GetHashCode특정 형식에 대한 해시 함수 역할을 합니다. (Object에서 상속됨)
Public 메서드GetType현재 인스턴스의 Type을 가져옵니다. (Object에서 상속됨)
Protected 메서드MemberwiseClone현재 Object의 단순 복사본을 만듭니다. (Object에서 상속됨)
Public 메서드정적 멤버OpenExisting보안 중요 이미 있는 경우 지정된 명명된 세마포를 엽니다.
Public 메서드Release()세마포를 종료하고 이전 카운트를 반환합니다.
Public 메서드Release(Int32)지정된 횟수만큼 세마포를 종료하고 이전 카운트를 반환합니다.
Public 메서드ToString현재 개체를 나타내는 문자열을 반환합니다. (Object에서 상속됨)
Public 메서드정적 멤버TryOpenExisting보안 중요 지정된 명명된 세마포가 이미 있는 경우 열고 작업의 성공 여부를 나타내는 값을 반환합니다.
Public 메서드WaitOne()현재 WaitHandle이 신호를 받을 때까지 현재 스레드를 차단합니다. (WaitHandle에서 상속됨)
Public 메서드WaitOne(Int32)부호 있는 32비트 정수를 사용하여 시간 간격을 지정하고 현재 WaitHandle이 신호를 받을 때까지 현재 스레드를 차단합니다. (WaitHandle에서 상속됨)
Public 메서드WaitOne(TimeSpan)TimeSpan을 사용하여 시간 간격을 측정하면서 현재 인스턴스가 신호를 받을 때까지 현재 스레드를 차단합니다. (WaitHandle에서 상속됨)
맨 위

Semaphore 클래스를 사용하여 리소스 풀에 대한 액세스를 제어합니다. 스레드는 WaitHandle 클래스에서 상속된 WaitOne 메서드를 호출하여 세마포에 진입하고, Release 메서드를 호출하여 세마포를 해제합니다.

세마포에 대한 카운트는 스레드가 세마포에 진입할 때마다 감소하고 스레드가 세마포를 해제하면 증가합니다. 카운트가 0이면 다른 스레드가 세마포를 해제할 때까지 후속 요청이 차단됩니다. 모든 스레드가 세마포를 해제하면 카운트는 세마포가 만들어질 때 지정된 최대값이 됩니다.

차단된 스레드가 세마포에 진입할 때 FIFO 또는 LIFO와 같은 약속된 순서는 없습니다.

스레드는 WaitOne 메서드를 반복 호출하여 세마포에 여러 번 진입할 수 있습니다. 스레드는 이러한 엔트리를 일부 또는 모두 해제하기 위해 매개 변수 없는 Release() 메서드 오버로드를 여러 번 호출하거나, 해제할 엔트리 수를 지정한 Release(Int32) 메서드 오버로드를 호출할 수 있습니다.

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

세마포는 로컬 세마포와 명명된 시스템 세마포 등 두 가지 유형이 있습니다. 이름을 허용하는 생성자를 사용하여 Semaphore 개체를 만들면 해당 이름의 운영 체제 세마포에 연결됩니다. 명명된 시스템 세마포는 운영 체제 전체에서 볼 수 있으며 프로세스 작업을 동기화하는 데 사용할 수 있습니다. 같은 명명된 시스템 세마포를 나타내는 여러 Semaphore 개체를 만들 수 있으며, OpenExisting 메서드를 사용하여 기존의 명명된 시스템 세마포를 열 수 있습니다.

로컬 세마포는 프로세스 내에만 있습니다. 로컬 세마포는 로컬 Semaphore 개체에 대한 참조가 있는 프로세스 내 스레드에서 사용할 수 있습니다. 각 Semaphore 개체는 별도의 로컬 세마포입니다.

다음 코드 예제에서는 최대 카운트가 3이고 초기 카운트가 0인 세마포를 만듭니다. 예제에서는 세마포를 기다리지 않도록 차단하는 5개의 스레드를 시작합니다. 주 스레드에서는 3개의 스레드가 세마포에 진입하도록 허용하여 Release(Int32) 메서드 오버로드를 통해 세마포 카운트를 최대값까지 증가시킵니다. 각 스레드는 Thread.Sleep 메서드를 사용하여 1초 동안 기다리고 작업을 시뮬레이션한 다음 Release() 메서드 오버로드를 사용하여 세마포를 해제합니다. 세마포가 해제될 때마다 이전 세마포 카운트가 표시됩니다. 콘솔 메시지가 세마포 사용을 추적합니다. 출력을 쉽게 읽을 수 있도록 시뮬레이션된 작업 간격이 각 스레드마다 약간씩 증가됩니다.

Windows Phone OS

지원되는 버전: 8.0

이 형식은 스레드로부터 안전합니다.

표시:
© 2014 Microsoft