지우너
[C# 게임 서버] 멀티쓰레드 프로그래밍(4) 본문
드디어 섹션1 멀티쓰레드 프로그래밍의 마지막 강의 정리를 올린다... TLS를 완벽하게 이해하고 싶어서 열심히 마이크로소프트 문서를 읽어봤으나(정확히 말하자면 문서에 나온 TLS 작동방식 다이어그램을 이해하고 싶었다...), OS 지식의 부족이 문제인지 잘 이해가 가지 않았다. 지금 보고 있는 인프런 강의가 끝나면 대학교 때 배웠던 OS 필기를 다시 보면서 복습해야 할 것 같다...
1. TLS
게임을 예로 든다면 게임로직, DB, 클라이언트 세션 관리, 로그 찍기 등 다양한 분야들이 나뉜다. 그런데 얘네들이 코드 로직적으로 생각해보면 어느 정도 연관되어 있다. 예를 들어 게임 로직을 실행해서 아이템을 강화하는 작업을 한다면 이걸 DB에 저장해야 하니까 DB에도 갔다 와야 하고, 성공적으로 뭔가 이뤄졌으면 클라이언트 세션을 통해서 클라이언트도 네트워크를 통해 전송해야 하니까 연관성이 있다.
여러 쓰레드가 이용해야 하는 (경합이 일어날 수 있는)데이터에는 lock을 달아줘야 한다고 배웠다. 그런 의미에서 게임로직, DB, 클라이언트 세션 관리, 로그의 모든 전역데이터 부분을 lock으로 처리한다고 생각해보자
lock을 이렇게 모든 부분에 하나씩 배치하면 어떤 일이 벌어질까?
lock은 상호배타적인 개념이기 때문에 직원들이 일을하려고 이렇게 몰려도 한 번에 한 명씩 밖에 못 들어가는데, 어떤 변수에 여러 쓰레드가 접근하고자 몰릴 경우 처리가 굉장히 어려워진다.
글을 쓰는 데 시간이 많이 걸릴 거 같아서 PPT로 정리한 걸 올립니다...ㅎㅎ
아래는 마이크로소프트 문서 번역을 보며 정리한 것
[코드]
class Program
{
static ThreadLocal<string> _threadNameTLS = new ThreadLocal<string>(() => { return $"My name is: {Thread.CurrentThread.ManagedThreadId}"; });
static void SetThreadName()
{
bool repeat = _threadNameTLS.IsValueCreated;
if (repeat)
Console.WriteLine(_threadNameTLS.Value+"(repeat)");
else
Console.WriteLine(_threadNameTLS.Value);
}
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(3, 3);
Parallel.Invoke(SetThreadName, SetThreadName, SetThreadName, SetThreadName, SetThreadName);
// ?는 null 조건 연산자(Null-conditional operator)
_threadNameTLS?.Dispose();
}
}
[참고 사이트]
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
'Programming > Server' 카테고리의 다른 글
[C# 게임서버] 네트워크 프로그래밍(2) (0) | 2024.01.19 |
---|---|
[C# 게임서버] 네트워크 프로그래밍(1) (0) | 2024.01.16 |
[C# 게임 서버] 멀티쓰레드 프로그래밍(3) (0) | 2024.01.12 |
[C# 게임 서버] 멀티쓰레드 프로그래밍(2) (0) | 2024.01.11 |
[C# 게임 서버] 멀티쓰레드 프로그래밍(1) (0) | 2024.01.07 |