이 글은 아래 강의를 정리한 글이다
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 강의 | Rookiss - 인프런
Rookiss | 네트워크/멀티쓰레드/운영체제 등 핵심 전공 지식을 공부하고 게임 서버를 바닥부터 만들어보면서 MMORPG 기술을 학습하는 강의입니다., MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By St
www.inflearn.com
해당 정리글을 한번에 보고 싶다면 아래 링크를 참조하길 바란다
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 | Notion
서버OT
mesquite-prune-8c9.notion.site
Lock 기초
InterLocked는 딱 하나 단점이 정수 연산밖에 되질 않는다.
Lock 중에 Monitor에 대해 설명
더보기
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ServerCore
{
class Program
{
static int number = 0;
static object _obj = new object();
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
// 상호배제 Mutual Exclusive
Monitor.Enter(_obj);
// 문을 잠금
number++;
Monitor.Exit(_obj);
// 잠금을 품
// 직접적으로 사용하면 관리하기 어려운 단점이 있음
// 예시로 Monitor.Exit를 안하고 return 할 경우 프로그램이 끝나지 않음
// DeadLock 교착 상황이 발생하게 됨
// Critical Section, 임계 영역에 대한 언급
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; i++)
{
Monitor.Enter(_obj);
number--;
Monitor.Exit(_obj);
}
}
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);
}
}
}
직접적으로 관리하기 어렵기 떄문에 lock이라는 키워드를 사용하여 lock을 관리
lock 실습
더보기
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ServerCore
{
class Program
{
static int number = 0;
static object _obj = new object();
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
lock (_obj)
{
number++;
}
}
}
static void Thread_2()
{
for (int i = 0; i < 100000; i++)
{
lock (_obj)
{
number--;
}
}
}
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);
}
}
}
'Unity' 카테고리의 다른 글
[던전 크롤링] 인벤토리 시스템 (0) | 2024.09.25 |
---|---|
[인프런 강의 정리] 데드락, 락 구현 연습 (0) | 2024.09.25 |
[인프런 강의 정리] Interlocked (0) | 2024.09.25 |
[인프런 강의 정리] 메모리 배리어 (0) | 2024.09.25 |
[인프런 강의 정리] 컴파일러 최적화, 캐시이론 (0) | 2024.09.25 |