728x90
반응형
이전글
[c#] 쓰레드 동기화 클래스 1(Lock, Monitor)
1. Mutex
Mutex는 Monitor와 비슷하지만 한 프로세스 내 뿐만 아니라 프로세스간에서도 Locking이 가능하다.
하지만 Monitor Locking에 비해 50배 정도 느리므로 한 프로세스 내에서 Lock이 필요한 경우는 Lock이나 Monitor를 쓴다.
Mutex를 using문으로 감쌌다고 해서 lock처럼 생각하면 안된다. mutex.ReleaseMutex를 사용해서 해제해야한다.
using System;
using System.Threading;
namespace ThreadSafe
{
class Program
{
private static int baby = 0;
private static object lockObj = new object();
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
new Thread(CountBaby).Start();
}
}
private static void CountBaby()
{
using (Mutex m = new Mutex(false, "MutexName"))
{
if (m.WaitOne(1000))
{
baby++;
Console.WriteLine(baby);
}
else
{
Console.WriteLine("뮤텍스를 취득할 수 없습니다.");
}
m.ReleaseMutex();
}
}
}
}
결과 값
이전의 게시글인 Lock과 Monitor의 결과 값과 동일하고 releaseMutex()를 사용하지 않았을 때의 결과 값을 확인해 보자.
이런식으로 취득할 수 없다가 에러가 뜬다.
2. Semaphore
이 클래스는 공유된 리소스를 지정된 수의 쓰레드들만 엑세스하게 허용한다. (복수개 허용 가능하단말이다.)
10개를 사용한다면 11번째 쓰레드는 저 10개 쓰레드 중 누군가 작업이 끝나야 리소스를 사용할 수 있게 된다.
using System;
using System.Threading;
namespace ThreadSafe
{
class Program
{
private static int baby = 0;
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
new Thread(CountBaby).Start();
}
}
private static void CountBaby()
{
Semaphore s = new Semaphore(5, 5); // 처음 요청 개수, 최대 요청 개수
s.WaitOne(); // 5개만 들어온다.
baby++;
Console.WriteLine( baby);
Thread.Sleep(400);
s.Release(); // 1개 해제 -> 다음 쓰레드 들어올 수 있다.
}
}
}
결과값
5개가 동시에 들어오므로 1~10까지 순차적이지 않을 수 있다.
참고
728x90
반응형
'프로그래밍 > c#' 카테고리의 다른 글
[c#] STAThread/COM(Component Object Model) (0) | 2021.01.12 |
---|---|
[c#] 쓰레드 동기화 클래스 3(AutoResetEvent, ManualResetEvent, CountdownEvent) (0) | 2019.10.08 |
[c#] 쓰레드 동기화 클래스 1(Lock, Monitor) (0) | 2019.10.08 |
[c#] Thread Safe (쓰레드 동기화) (0) | 2019.10.08 |
[c#] 이벤트(event)와 델리게이트(delegate) (0) | 2019.10.08 |
댓글