프로세스
프로세스는 프로그램안에서 작업을 처리해주는 역할을 한다.
스레드
스레드는 프로세스 안에서 일을 처리해주는 일꾼으로 스레드 혼자서 처리한다면 싱글 스레드,
둘 이상의 스레드를 사용한다면 멀티스레드라고 부른다.
스레드의 장/단점
[장점]
- 여러 작업을 동시에 진행할 수 있어 자원을 보다 효율적으로 사용할 수 있다.
- 응답성이 좋다.
[단점]
- 구현하기 까다롭다.
- 테스트하기 어렵다. (Debug, Release)
- 스레드들이 각각 효율적으로 고르게 실행되도록 해야 한다.
💻 코드
기본적인 Thread 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void MainThread(object state)
{
for(int i=0; i<5; i++)
Console.WriteLine("Hello Thread");
}
static void Main(string[] args)
{
Thread t = new Thread(MainThread);
t.Name = "Test Thread"; // 쓰레드 이름 변경
t.IsBackground = true; // 주 쓰레드가 끝나면 종료할지 결정
t.Start(); // 쓰레드 시작
Console.WriteLine("Waiting For Thread!");
t.Join(); // t 쓰레드가 종료되면 다음 코드 진행
Console.WriteLine("Hello World!");
}
ThreadPool을 사용하면 스레드의 일꾼 수를 조절할 수 있고 오브젝트 풀링처럼 유동적으로 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static void MainThread(object state)
{
for(int i=0; i<5; i++)
Console.WriteLine("Hello Thread");
}
static void Main(string[] args)
{
// 쓰레드 일꾼을 5명 준비
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
// 4번 일을 시키는데 돌아오지 못할 정도로 일을 시킨다.
// 그렇게 되면 일꾼은 1명 남기 때문에 MainThread는 한번만 실행된다.
for (int i = 0; i < 4; i++)
ThreadPool.QueueUserWorkItem((obj) => { while (true) { } });
// 잠깐만 쓰고 그 이후론 안쓸 단기 알바 느낌의 쓰레드
// 다른 일을 하고있는 쓰레드가 끝나면 돌아와서 기다리는 느낌임!
// 쓰레드풀은 되도록 작은 일을 시키는 것이 좋다.
ThreadPool.QueueUserWorkItem(MainThread);
while(true)
{
}
}
멀티 스레드를 사용할 때 스레드가 일 처리에 있어 오래걸릴 경우
Task의 TaskCreationOptions.LongRunning 옵션을 사용하여 일처리가 오래 걸린다는 것을 알릴 수 있다.
1
2
3
4
5
for (int i = 0; i < 5; i++)
{
Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
t.Start();
}