Semaphore 클래스
Semaphore 클래스는 공유된 리소스를 지정된 수의 쓰레드들만 엑세스할 수 있게 허용하는데, 예를 들어 최대 10개의 쓰레드들이 엑세스하도록 허용하였다면, 11번째 쓰레드는 현재 사용 중인 10개의 쓰레드중 누군가가 리소스 사용을 마쳐야지만, 그 리소스를 사용할 수 있게 된다. lock, Monitor, Mutex가 한번에 한 쓰레드만을 허용하는 반면, Semaphore는 복수 개의 쓰레드가 동시에 리소스를 엑세스하는 것을 허용한다.
예제
using System;
using System.Threading;
namespace MultiThrdApp
{
class Program
{
static void Main()
{
MyClass c = new MyClass();
// 10개 쓰레드들 실행
// 처음 5개만 먼저 실행되고 하나씩 해제와 함께
// 실행될 것임.
for (int i = 1; i <= 10; i++)
{
new Thread(c.Run).Start(i);
}
}
}
class MyClass
{
private Semaphore sema;
public MyClass()
{
// 5개의 쓰레드만 허용
sema = new Semaphore(5, 5);
}
public void Run(object seq)
{
// 쓰레드가 가진 데이타(일련번호)
Console.WriteLine(seq);
// 최대 5개 쓰레드만 아래 문장 실행
sema.WaitOne();
Console.WriteLine("Running#" + seq);
Thread.Sleep(500);
// Semaphore 1개 해체.
// 이후 다음 쓰레드 WaitOne()에서 진입 가능
sema.Release();
}
}
}
using System.Threading;
namespace MultiThrdApp
{
class Program
{
static void Main()
{
MyClass c = new MyClass();
// 10개 쓰레드들 실행
// 처음 5개만 먼저 실행되고 하나씩 해제와 함께
// 실행될 것임.
for (int i = 1; i <= 10; i++)
{
new Thread(c.Run).Start(i);
}
}
}
class MyClass
{
private Semaphore sema;
public MyClass()
{
// 5개의 쓰레드만 허용
sema = new Semaphore(5, 5);
}
public void Run(object seq)
{
// 쓰레드가 가진 데이타(일련번호)
Console.WriteLine(seq);
// 최대 5개 쓰레드만 아래 문장 실행
sema.WaitOne();
Console.WriteLine("Running#" + seq);
Thread.Sleep(500);
// Semaphore 1개 해체.
// 이후 다음 쓰레드 WaitOne()에서 진입 가능
sema.Release();
}
}
}