728x90
반응형
Interlock과 같이 공유 자원 선점의 동기화를 위해 사용 된다
Interlock 의 경우 특정 쓰레드 동기화가 필요한 코드 블럭 {임 계 구 역}을 동기화 할 때 쓰기 보다는 특정 변수의 Increment 와 Decrement를 할때 많이 쓰인다 코드 블럭 단위의 임계 구역의 진입을 제어하기 위해 Monitor와 lock가 제공 된다 여기서 사용 되는 object obj는 세마포어 에서 비유 되는 자물쇠와 같은 역할이다
P(), V(),
Semaphore(obj) RS = obj
P();
//
if(RS >0 then RS= RS-1;
else block();
//
{
임계구역
}
V()
//
RS = RS+1;
wake_up();
//
Monitor 사용 예제
namespace Monitor_Ex
{
class Program
{
static int num = 0;
static object _lock = new object();
static void Thread_1()
{
for (int i = 0; i < 100000; ++i)
{
Monitor.Enter(_lock);
num++;
Monitor.Exit(_lock);
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; ++i)
{
Monitor.Enter(_lock);
num--;
Monitor.Exit(_lock);
}
}
static void Main(string[] args)
{
Thread t1 = new Thread(Thread_1);
Thread t2 = new Thread(Thread_2);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine(num);
}
}
}
하지만 만약 임계 구역 내에 break; 문이 있어서 Enter(lock) 이후 Exit(wack_up) 상태로 _lock을 전이 시켜주지 못하면 데드락에 빠질 위험이 생길수도 있는데 이 경우 편의성을 좋게 하기 위해선
lock를 사용하면 좋다
lock
lock의 장점
- 모니터와 마찬가지로 상호 배제 역할 수행
- 동기화가 이루어 지지 않아 Exit 신호를 기다리며 대기큐에 교착 상태의 실수를 줄일수 있다
- 좀 더 보기 편하다
namespace Lock_EX
{
internal class Program
{
static int num = 0;
static object _lock = new object();
static void Thread_1()
{
for (int i = 0; i < 100000; ++i)
{
lock (_lock)
{
num++;
}
}
}
static void Thread_2()
{
for(int i = 0;i <100000l ; ++i)
{
Monitor.Enter(_lock);
num--;
Monitor.Exit(_lock);
}
}
static void Main(string[] args)
{
Thread t1 = new Thread(Thread_1);
Thread t2 = new Thread(Thread_2);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine(num);
}
}
}
728x90
반응형
'개인 스터디' 카테고리의 다른 글
영업 관리 시스템 (0) | 2024.11.14 |
---|---|
비동기 TCP 서버 (0) | 2024.10.17 |
스핀락 (0) | 2024.10.16 |
C# Thread(스레드) 주요 속성과 메서드 (0) | 2024.10.15 |
무명 메서드 (Anonymous Method) (0) | 2024.10.14 |