문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문
이 설명서는 보관되지만 유지 되지 않습니다.

Semaphore.Release 메서드 (Int32)

지정된 횟수만큼 세마포를 종료하고 이전 카운트를 반환합니다.

네임스페이스:  System.Threading
어셈블리:  System(System.dll)

public int Release(
	int releaseCount
)

매개 변수

releaseCount
형식: System.Int32
세마포를 종료할 횟수입니다.

반환 값

형식: System.Int32
Release 메서드가 호출되기 전의 세마포 카운트입니다.

예외상황
ArgumentOutOfRangeException

releaseCount가 1보다 작은 경우

SemaphoreFullException

세마포 카운트가 이미 최대값인 경우

IOException

명명된 세마포에서 Win32 오류가 발생한 경우

UnauthorizedAccessException

현재 세마포가 명명된 시스템 세마포를 나타내지만 사용자에게 SemaphoreRights.Modify 권한이 없는 경우

또는

현재 세마포가 명명된 시스템 세마포를 나타내지만 세마포가 SemaphoreRights.Modify 권한을 사용하여 열리지 않은 경우

스레드가 세마포에 여러 번 진입한 경우, 이 메서드 오버로드를 사용하면 한 번의 호출로 전체 세마포 카운트를 복원할 수 있습니다.

Release 메서드에서 SemaphoreFullException이 throw되어도 호출한 스레드에 반드시 문제가 있는 것은 아닙니다. 다른 스레드의 프로그래밍 오류로 인해 해당 스레드에서 진입한 횟수보다 더 많이 세마포를 종료했을 수도 있습니다.

현재 Semaphore 개체가 명명된 시스템 세마포를 나타내는 경우, 사용자가 SemaphoreRights.Modify 권한을 가지고 있어야 하며 세마포가 SemaphoreRights.Modify 권한을 사용하여 열려 있어야 합니다.

다음 코드 예제에서는 최대 카운트가 3이고 초기 카운트가 0인 세마포를 만듭니다. 예제에서는 세마포를 기다리지 않도록 차단하는 5개의 스레드를 시작합니다. 주 스레드에서는 3개의 스레드가 세마포에 진입하도록 허용하여 Release(Int32) 메서드 오버로드를 통해 세마포 카운트를 최대값까지 증가시킵니다. 각 스레드는 Thread.Sleep 메서드를 사용하여 1초 동안 기다리고 작업을 시뮬레이션한 다음 Release() 메서드 오버로드를 사용하여 세마포를 해제합니다.

세마포가 해제될 때마다 이전 세마포 카운트가 표시됩니다. 콘솔 메시지가 세마포 사용을 추적합니다. 출력을 쉽게 읽을 수 있도록 시뮬레이션된 작업 간격이 각 스레드마다 약간씩 증가됩니다.


using System;
using System.Threading;

public class Example
{
    // A semaphore that simulates a limited resource pool.
    //
    private static Semaphore _pool;

    // A padding interval to make the output more orderly.
    private static int _padding;

    public static void Main()
    {
        // Create a semaphore that can satisfy up to three
        // concurrent requests. Use an initial count of zero,
        // so that the entire semaphore count is initially
        // owned by the main program thread.
        //
        _pool = new Semaphore(0, 3);

        // Create and start five numbered threads. 
        //
        for(int i = 1; i <= 5; i++)
        {
            Thread t = new Thread(new ParameterizedThreadStart(Worker));

            // Start the thread, passing the number.
            //
            t.Start(i);
        }

        // Wait for half a second, to allow all the
        // threads to start and to block on the semaphore.
        //
        Thread.Sleep(500);

        // The main thread starts out holding the entire
        // semaphore count. Calling Release(3) brings the 
        // semaphore count back to its maximum value, and
        // allows the waiting threads to enter the semaphore,
        // up to three at a time.
        //
        Console.WriteLine("Main thread calls Release(3).");
        _pool.Release(3);

        Console.WriteLine("Main thread exits.");
    }

    private static void Worker(object num)
    {
        // Each worker thread begins by requesting the
        // semaphore.
        Console.WriteLine("Thread {0} begins " +
            "and waits for the semaphore.", num);
        _pool.WaitOne();

        // A padding interval to make the output more orderly.
        int padding = Interlocked.Add(ref _padding, 100);

        Console.WriteLine("Thread {0} enters the semaphore.", num);

        // The thread's "work" consists of sleeping for 
        // about a second. Each thread "works" a little 
        // longer, just to make the output more orderly.
        //
        Thread.Sleep(1000 + padding);

        Console.WriteLine("Thread {0} releases the semaphore.", num);
        Console.WriteLine("Thread {0} previous semaphore count: {1}",
            num, _pool.Release());
    }
}


.NET Framework

4, 3.5, 3.0, 2.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

Windows 7, Windows Vista SP1 이상, Windows XP SP3, Windows XP SP2 x64 버전, Windows Server 2008(Server Core는 지원되지 않음), Windows Server 2008 R2(Server Core는 SP1 이상에서 지원됨), Windows Server 2003 SP2

.NET Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.
표시: