Thread
※아래와 같은 방법으로 Thread를 직접 만들어 사용할 경우 만든 개발자가 끝까지 책임져야하는 스레드이다. (어떤 일을 할 때 마다 정직원을 고용하는 개념) 성능에 많은 부하가 갈 수 있다.
IsBackground - True를 선택할 경우 메인스레드가 종료되면 함께 종료된다. (선택해줘야함)
Join - 현재 새로 만든 스레드가 종료될 때까지 아래 메인스레드는 실행 할 수 없다.
static void MainThread()
{
for (int i = 0; i < 5; i++)
Console.WriteLine("안녕");
}
static void Main(string[] args)
{
Thread t = new Thread(MainThread);
t.Name = "테스트스레드";
t.IsBackground = true;
t.Start();
t.Join();//T스레드가 끝날 때까지 다른스레드는 기다려라.
Console.WriteLine("종료");
}
ThreadPool
※이미 만들어진 스레드를 잠깐 사용하는 용도로 부하가 적다.(새롭게 고용하는 직원이아닌 고용된 직원을 유동적으로 사용하는 개념, Unity의 오브젝트 풀과 같은 개념이다.)
※스레드 풀을 사용할 때는 짧게 사용하는 곳에서 사용해야 용의하다.(무한으로 실행할 경우 영영 안돌아 올 수 있음)
IsBackground - (기본 True상태)
static void MainThread(object state)
{
for (int i = 0; i < 5; i++)
Console.WriteLine("안녕");
}
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(MainThread);
while (true)
{
}
}
----------------------------------------------------------------------
ThreadPool.SetMinThreads(1, 1); - 스레드풀 최소 값
ThreadPool.SetMaxThreads(5, 5); - 스레드풀 최대 값
아래 for문에서 무한 루프를 도는 ThreadPool 5개를 선언 했기때문에 for문 아래 ThreadPool은 실행되지 않는다.
결국 무한루프에서 사용을 잘 못 하게되면 코드가 멈출 수 있다.
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem((obj) => { while (true) { } });
}
ThreadPool.QueueUserWorkItem(MainThread);
Task
Task는 기본적으로 ThreadPool 에서 관리를 한다.
TaskCreationOptions.LongRunning을 사용하면 ThreadPool에서 setMaxTrheads를 사용하여 갯수를 정해줘도
동작 할 수 있다. Thread가 오래걸리는 작업이라고 명시하여 Thread를 개별적으로 사용하는 것 처럼 쓸 수 있다.
즉 ThreadPool과 Thread의 장점을 합처서 사용하는 것 이다.
결론 - 오래걸리는 작업이라고 Thread를 사용하지말고 Task의 TaskCreationOptions.LongRunning를 사용하여 사용 할 수 있다.
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
for (int i = 0; i < 5; i++)
{
Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
t.Start();
}
'VisualStudio > C#서버' 카테고리의 다른 글
[C#서버][개념] 임계영역 Spin락(스핀락(SpinLock)) (0) | 2022.10.26 |
---|---|
[C#서버][개념] 임계영역(크리티컬섹션)원자성 - 레이스컨디션(Race Condition)과 Interlocked (0) | 2022.10.26 |
[C#서버][개념] 메모리 베리어( Memory Barrier) (0) | 2022.10.26 |
[C#서버][개념] volatile을 사용해 어셈블리 최적화 막기 (0) | 2022.10.26 |
[C#서버][기초] Thread 테스트 방법 (0) | 2022.10.26 |