For me
[Server] Lock - 1 본문
Interlocked의 단점 - 정수만 사용 가능
Lock
using System;
namespace Server
{
class Program
{
private static int number = 0;
private static object _obj = new Object();
static void Thread1()
{
for (int i = 0; i < 10000; i++)
{
Monitor.Enter(_obj);
number++;
Monitor.Exit(_obj);
}
}
static void Thread2()
{
for (int i = 0; i < 10000; i++)
{
Monitor.Enter(_obj);
number--;
Monitor.Exit(_obj);
}
}
static void Main(string[] args)
{
Task t1 = new Task(Thread1);
Task t2 = new Task(Thread2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine(number);
}
}
}
상호 배제 Mutual Exclusive
- Monitor.Enter(obj), Monitor.Exit(obj)
- Enter과 Exit 사이의 작업이 완료될때 까지 다른 곳에서 접근 불가
- 즉, Enter 과 Exit 사이의 작업이 완료될 때 까지 싱글 스레드 라고 생각하고 작업해도 상관 없음
단점
- Enter,Exit를 반드시 짝을 맞춰야 하기 때문에 관리하기 어려움
- DeadLock 발생 쉬움
해결방안
1) try{} finally{} 사용
static void Thread1()
{
for (int i = 0; i < 10000; i++)
{
try
{
Monitor.Enter(_obj);
number++;
}
finally
{
Monitor.Exit(_obj);
}
}
}
2) lock(_obj){ } 키워드 사용 (중요)
static void Thread1()
{
for (int i = 0; i < 10000; i++)
{
lock(_obj)
{
number++;
}
}
}'Server > Study' 카테고리의 다른 글
| [Server] Lock - 3 (SpinLock) (0) | 2023.04.26 |
|---|---|
| [Server] Lock - 2 (0) | 2023.04.26 |
| [Server] Interlocked (1) | 2023.04.26 |
| [Server] MemoryBarrier (0) | 2023.04.25 |
| [Server] 컴파일러 최적화 (Release) (0) | 2023.04.25 |