세마포 개체

세마포 개체는 0과 지정된 최대값 사이의 개수를 유지하는 동기화 개체입니다. 스레드가 세마포 개체에 대한 대기를 완료하고 스레드가 세마포를 해제할 때마다 증가될 때마다 수가 감소합니다. 개수가 0에 도달하면 더 이상 스레드가 세마포 개체 상태가 신호를 받기를 기다릴 수 없습니다. 세마포 상태는 해당 개수가 0보다 크면 신호 알림으로 설정되고 해당 개수가 0이면 신호 알림 해제로 설정됩니다.

세마포 개체는 제한된 수의 사용자를 지원할 수 있는 공유 리소스를 제어하는 데 유용합니다. 리소스를 공유하는 스레드 수를 지정된 최대 수로 제한하는 게이트 역할을 합니다. 예를 들어 애플리케이션이 만드는 창 수에 제한을 두는 경우도 있습니다. 창 제한과 동일한 최대 개수의 세마포를 사용하여 창을 만들 때마다 수를 감소시키고 창을 닫을 때마다 증가합니다. 애플리케이션은 각 창이 생성되기 전에 대기 함수 중 하나를 호출할 때 세마포 개체를 지정합니다. 창 제한에 도달했음을 나타내는 수가 0이면 대기 함수는 창 만들기 코드의 실행을 차단합니다.

스레드는 CreateSemaphore 또는 CreateSemaphoreEx 함수를 사용하여 세마포 개체를 만듭니다. 만드는 스레드는 개체의 초기 개수와 개수의 최대값을 지정합니다. 초기 개수는 0보다 작거나 최댓값보다 크지 않아야 합니다. 만드는 스레드는 세마포 개체의 이름을 지정할 수도 있습니다. 다른 프로세스의 스레드는 OpenSemaphore 함수 호출에서 해당 이름을 지정하여 기존 세마포 개체에 대한 핸들을 열 수 있습니다. 뮤텍스, 이벤트, 세마포 및 타이머 개체의 이름에 대한 자세한 내용은 Interprocess Synchronization을 참조하세요.

두 개 이상의 스레드가 세마포에서 대기 중인 경우 대기 스레드가 선택됩니다. FIFO(선점) 순서를 가정하지 마세요. 커널 모드 APC와 같은 외부 이벤트는 대기 순서를 변경할 수 있습니다.

세마포 상태가 신호로 설정되었기 때문에 대기 함수 중 하나가 반환될 때마다 세마포 수가 1씩 감소합니다. ReleaseSemaphore 함수는 세마포 수를 지정된 양만큼 증가합니다. 개수는 0보다 작거나 최대값보다 클 수 없습니다.

세마포의 초기 개수는 일반적으로 최대값으로 설정됩니다. 그런 다음, 보호된 리소스가 사용됨에 따라 개수가 해당 수준에서 감소합니다. 또는 초기 개수가 0인 세마포를 만들어 애플리케이션이 초기화되는 동안 보호된 리소스에 대한 액세스를 차단할 수 있습니다. 초기화 후 ReleaseSemaphore 를 사용하여 개수를 최대값으로 증분할 수 있습니다.

뮤텍스 개체를 소유하는 스레드는 실행이 차단되지 않고 동일한 뮤텍스 개체가 신호를 받기를 반복적으로 기다릴 수 있습니다. 그러나 동일한 세마포 개체에 대해 반복적으로 대기하는 스레드는 대기 작업이 완료 될 때마다 세마포의 수를 감소합니다. 개수가 0이 되면 스레드가 차단됩니다. 마찬가지로 뮤텍스를 소유하는 스레드만 ReleaseMutex 함수를 성공적으로 호출할 수 있지만 모든 스레드는 ReleaseSemaphore 를 사용하여 세마포 개체의 수를 늘릴 수 있습니다.

스레드는 대기 함수를 호출할 때 동일한 세마포 개체를 반복적으로 지정하여 세마포 수를 두 번 이상 감소할 수 있습니다. 그러나 동일한 세마포의 여러 핸들을 포함하는 배열을 사용하여 다중 개체 대기 함수 중 하나를 호출해도 여러 감소가 발생하지는 않습니다.

세마포 개체 사용을 마쳤으면 CloseHandle 함수를 호출하여 핸들을 닫습니다. 세마포 개체는 마지막 핸들이 닫혔을 때 제거됩니다. 핸들을 닫는 것은 세마포 수에 영향을 주지 않습니다. 따라서 핸들을 닫기 전에 또는 프로세스가 종료되기 전에 ReleaseSemaphore 를 호출해야 합니다. 그렇지 않으면 시간 제한 값이 지정되었는지 여부에 따라 보류 중인 대기 작업이 시간 초과되거나 무기한으로 계속됩니다.

세마포 개체 사용