인프런 강의 를 듣고, 개인 공부 목적으로 정리한 글입니다.
static void MainThread(object state)
{
...
}
static void Main(string[] args)
{
Thread t = new Thread(MainThread);
t.Name = "Test Thread"; // 스레드 이름 지정
t.IsBackground = true; // 백그라운드에서 실행 - 메인이 끝나면 종료된다. (디폴트 : false)
t.Start();
Console.WriteLine("Waiting for Thread!");
t.Join(); // 스레드 t의 종료를 기다린다. 끝나면 다음 실행
}
new Thread
를 통해 쓰레드를 생성한다.
t.Name = "Test Thread"
: 쓰레드 이름 생성
디버깅 할 때 편리하다
t.IsBackground
: 쓰레드가 백그라운드에서 실행될지 여부를 결정한다.
기본값은 false
t.Start()
: 쓰레드 실행
t.Join()
: 쓰레드의 종료를 기다린다.
cw tab 하면 Console.WriteLine();
이 자동으로 완성된다 나이스
창고에 넣어 놨다가 필요할 때 꺼내서 쓴다는 개념
쓰레드 풀에 쓰레드들을 넣어놓고, 필요할 때 남아있는 애들을 꺼내서 쓴다.
new Thread
로 쓰레드를 생성하면 온전히 책임지며 관리해줘야 한다...
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1); // 인자 1 : 일을 할 아이
ThreadPool.SetMaxThreads(5, 5); // 최대 쓰레드 = 5개. 그 이상은 실행안됨
ThreadPool.QueueUserWorkItem(MainThread);
while(true)
{
}
}
}
ThreadPool.SetMinThread()
: 쓰레드 최소 개수 지정
ThreadPool.SetMaxThread()
: 쓰레드 최대 개수 지정
SetMaxThread로 지정한 개수를 넘어선 쓰레드는 실행될 수 없다.
(사실 위 두 함수를 사용하지 않아도 알아서 지정해주기는 한다)
ThreadPool.QueueUserWorkItem()
: 쓰레드에게 일을 던져준다.
위 코드에 있는 MainThread를 넣어주면 된다.
여기서는 Object가 실행하도록 해야 하므로
위 MainThread의 인자에 Object를 넣었다.
쓰레드가 할 일감을 정의한다.
쓰레드 풀에 넣어서 사용할 수 있다.
쓰레드의 경우,
한 쓰레드에 일이 과도하게 몰리면 다른 쓰레드가 점유되지 못하면서 문제가 발생할 수 있다.
Task는 작업 단위로 일을 시킬 수 있으니까
쓰레드에게 적절히 분배하기 좋다.
기본적으로 작업
단위로 수행시키려면, Task를 사용한다.
오래걸리는 작업, 무거운 작업이 아닌 간단한 일들.
Task에 지정한 일이 오래 걸리는 작업이라면, 인자로 옵션을 넣어주면 된다.
Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
t.Start();
이렇게
TaskCreationOptions.LongRunning
옵션을 넣어주게 되면,
오래 걸리는 작업이라는 것을 알려주게 되고
별도의 쓰레드를 만들어서 해당 일을 처리한다.
그래서 쓰레드 풀에서는 문제 없이 다른 일을 병렬적으로 실행할 수 있다.
: 쓰레드마다 고유하게 접근할 수 있는 전역변수
Stack 영역에 선언한 지역변수처럼 다른 쓰레드와 관련없이 고유한 값을 가지지만,
Stack과 달리 휘발성이 없고 반영구적으로 안전하게 사용할 수 있다.
특정 쓰레드만 사용할 정보들을 저장하기에 좋다.
전역 (공용 공간)에 접근할 횟수를 줄일 수 있다.
: 전역에서 한 번에 여러 개의 데이터를 가져와서
로컬에서 Lock 없이 편하게 실행하면 lock을 줄일 수 있다.
ThreadLocal<>
: 쓰레드마다, 접근하면 자신만의 공간(local)에 저장됨
예)
static ThreadLocal<string> ThreadName = new ThreadLocal<string>();
Parallel.Invoke()
: 쓰레드를 병렬적으로 실행할 수 있게 한다.
변수명.Dispose()
: 필요없을때 해제해준다