Unity

[인프런 강의 정리] 멀티쓰레드 개론, 쓰레드 만들기

wny0320 2024. 9. 25. 18:53

이 글은 아래 강의를 정리한 글이다

 

[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


멀티쓰레드 개론

  • cpu와 쓰레드, 프로세스 작동 방식
    • cpu 코어가 쓰레드를 실행하는것이 1:1대응으로 실행함
    • 여러 프로세스를 진행하기 위해서는 여러 프로세스를 우선순위에 따라 작업을 한다.
    • 쓰레드마다 개인 스택은 가지고 있지만 힙은 공용
    • 따라서 힙과 같은 공통 영역에 대해서 쓰레드를 할당해주어야 함

쓰레드 만들기

기본 쓰레드 구조

더보기
더보기
// 기본 쓰레드 구조
using System;
using System.Threading;

namespace ServerCore
{
    class Program
    {
        static void MainThread()
        {
		        // while(true)로 무한 반복하게 되면 프로그램이 끝나지 않음
            Console.WriteLine("Hello Thread!");
        }
        static void Main(string[] args)
        {
            Thread t = new Thread(MainThread);
            t.Name = "Thread Name";
            // 이 코드는 Thread 이름 정하기
            t.IsBackground = true;
            // 기본적으로 c#의 쓰레드는 foreground
            // background로 실행시키고 싶다면 IsBackground를 true로 바꿔준다.
            // main Thread가 종료되면 백그라운드 상태인 Thread도 종료된다.
            t.Start();
						// t.Join();
						// t.Join() 함수는 쓰레드가 종료될때까지 기다리는 함수
            Console.WriteLine("Hello World!");
            // ThreadPool.QueueUserWorkItem(MainThread);
            // 계속 사용하는 Thread가 아닌 잠깐 쓸 Thread는 이걸로 사용
            // 기본적으로 이 TheadPool은 background
        }
    }
}

Thread Pool을 이용하는 방법

더보기
더보기
using System;
using System.Threading;

namespace ServerCore
{
    class Program
    {
        static void MainThread(object state)
        {
            Console.WriteLine("Hello Thread!");
        }
        static void Main(string[] args)
        {
            ThreadPool.SetMinThreads(1, 1);
            ThreadPool.SetMaxThreads(5, 5);
            for(int i = 0; i < 5; i++)
            {
                ThreadPool.QueueUserWorkItem((obj) => { while(true); });
            }
            ThreadPool.QueueUserWorkItem(MainThread);
            // 최대 Thread 수가 5인데 5개가 모두 작업중이면 다른 일을 시켜도 작동하지 않음
        }
    }
}

Task에 대한 내용

더보기
더보기
Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
// Task는 Thread와 ThreadPool의 장점만을 가져온 느낌
// 뒤에 옵션을 안넣으면 ThreadPool과 같이 작동하지 않는 문제가 생기기도 함