멀티 쓰레드란?
프로그래밍에서 멀티 쓰레드란 간단히 하나의 프로그램안에서 여러가지의 프로그램을 동작하는 개념이라 볼 수 있다.
간단히 우리의 운영체제에서 그림판,인터넷,게임 등 3가지의 프로그램을 멀티쓰레드를 통해 동작한다고 이해할 수 있다.
using System.Threading;
static void MainThread()
{
Console.WriteLine("Hello Thread!");
}
static void Main(string[] args)
{
Thread t = new Thread(MainThread);
t.Name = "Test Thread";
t.Start();
Console.WriteLine("Hello World!");
}
쓰레드를 코드로 사용하기 위해선 가장 먼저 using 에 System.Threading을 해주어야한다.
이후 MainThread라는 함수를 만들어줘야한다.
쓰레드를 만들고 나면 각종 사용할 수 있는 함수가 있는데.
Name은 쓰레드의 이름을 설정해주는 것 이며.
t.Start를 해야만 실행된다.
using System;
using System.Threading;
namespace ServerCore
{
class Program
{
static void MainThread(object stats)
{
for(int i = 0; i < 5; i ++)
Console.WriteLine("Hello Thread!");
}
static void Main(string[] args)
{
// 단기 알바. 할일을 넘겨주고 끝남
ThreadPool.QueueUserWorkItem(MainThread);
//메인 직원 . 계속해서 일을 함
// Thread t = new Thread(MainThread);
// t.Name = "Test Thread";
// t.IsBackground = true;
// t.Start();
//Console.WriteLine("Wating For Thread");
// t.Join();
// Console.WriteLine("Hello World!");
while(true)
{
}
}
}
}
위 코드를 살펴보면 ThreadPool 과 일반 쓰레드와의 개념이 따로 존재한다.
간단히 일반 쓰레드는 정직원이라 생각하면 된다. 정직원인 경우 4대 보험도 들어줘야 하며 계속해서 사용해주어야 하기 때문에 부담이 클 수 밖에없다.
하지만 ThreadPool은 단기직원으로 생각하면 되고 해야할 일만 하고 끝나기 때문에 부담이 덜 하다. 다만 ThreadPool을 사용할려면 Thread 함수에서 Object라는 인자값이 필요하다.
다만 주의사항으로는 너무 많은 일감을 던져주면 ThreadPool.QueueUserWorkItem 자체가 통째로 먹통이 되기 때문에.
주의해주어야 한다.
일꾼정해주기
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
for (int i = 0; i < 4; i++)
ThreadPool.QueueUserWorkItem((obj) => { while (true) { } });
ThreadPool.QueueUserWorkItem(MainThread);
SetMinTherad와 SetMaxThread로 일꾼 수를 정해줄 수 있다.
간단히 for 문으로 4번 돌렸을 때 일꾼수를 모두 사용하기 떄문에. 아래 문장이 실행 되지
않지만. 3번 일 경우 한 자리가 남기때문에 아래문장까지 제대로 실행된다.
Task
Therad와 ThreadPool의 장점만을 모았다고 한다. 사용하기 위해선 Usnig Systsem.Threading.task 를 해줘어야한다.
for (int i = 0; i < 4; i++)
{
Task t = new Task(() => { while (true) { } });
t.Start();
}
// 단기 알바. 할일을 넘겨주고 끝남
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
//for (int i = 0; i < 4; i++)
// ThreadPool.QueueUserWorkItem((obj) => { while (true) { } });
ThreadPool.QueueUserWorkItem(MainThread);
해당 코드를 실행해보면. 아마 MainThread는 실행되지 않을거다. 왜냐하면 ThreadPool에서 지정해준 일꾼을 모두 사용했기 때문이다.
하지만 분명 Thread의 장점을 모았다고 하지 않았나?
for (int i = 0; i < 4; i++)
{
Task t = new Task(() => { while (true) { } },TaskCreationOptions.LongRunning);
t.Start();
}
// 단기 알바. 할일을 넘겨주고 끝남
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
//for (int i = 0; i < 4; i++)
// ThreadPool.QueueUserWorkItem((obj) => { while (true) { } });
ThreadPool.QueueUserWorkItem(MainThread);
요렇게 해주면 된다. 위 코드와의 차이점은 바로 Task 에선 인자값을 하나 더 받을 수 있는데
TaskCreationOptions.LongRunning이다. 이걸 사용하면 위 작업은 꽤나 긴 작업이라고 알려주기 때문에
Thread 처럼 사용할 수 있으며 ThreadPool에서 정한 일꾼을 사용하지 않는다고 볼 수 있다.
마치며 ..
알다싶이 해당 내용들은 인프런 MMORPG 만들기 강의를 보고 참고해서 본인 혼자 해석하고 쓴 내용이기에
해당 내용이 100% 맞다고 할 수 없다. 분명 해석이 틀린 부분도 있을 것이며 또한 본인의 필기노트 대용으로 사용하는
것이라 세세한 내용을 까진 적지 않았기 때문에 누가 본다면 이해하기 어려울 수 있을 것이다. 그렇기에 정말 자세히 알
고 싶다면 인프런에서 결제하여 직접 보는걸 추천한다.
'보류 > 인강을 보고 따라하는 MMORPG만들기! (월,화)' 카테고리의 다른 글
스핀 락(SpinLock) (0) | 2021.01.26 |
---|---|
ㄱ (0) | 2020.12.31 |
(독백)01.MMORPG 게임 개발 소개, 설치 환경 구성 (0) | 2020.11.24 |