728x90
직전 게시글에 쓴 Interlocked 외에도 원자성을 억지로 만들어줄 수 있는 기능이 있다. Monitor가 그것이다.
using System;
namespace ServerStudy
{
class Program
{
static int number = 0;
static object _lock = new object();
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
Monitor.Enter(_lock);
number++;
Monitor.Exit(_lock);
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; i++)
{
Monitor.Enter(_lock);
number--;
Monitor.Exit(_lock);
}
}
static void Main(string[] args)
{
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine(number);
}
}
}
원자성을 보존하고 싶은 내용의 위 아래로 Monitor.Enter과 Monitor.Exit을 넣어주면 안에 내용이 다 실행되기 전에 다른 스레드가 실행되는 일이 없어진다. 이렇게 다른 스레드에서도 사용되는 number와 같은 공유 자원이 동시에 사용되는 것을 막기 위한 알고리즘을 상호배제라고 한다.
728x90
'공부 > 게임 서버' 카테고리의 다른 글
[게임서버] Context Switching이란? (Thread.Sleep(1), Thread.Sleep(0), Thread.Yield()) (0) | 2022.05.26 |
---|---|
[게임서버] 스핀락(Spinlock)이란? (0) | 2022.05.25 |
[게임서버] Interlocked란? (0) | 2022.05.24 |
[게임서버] Temporal locality, Spatial locality (0) | 2022.05.23 |
[게임서버] 메모리 배리어(Memory Barrier)란? (0) | 2022.05.23 |