(C#) 스레드
포스트
취소

(C#) 스레드

프로세스

프로세스는 프로그램안에서 작업을 처리해주는 역할을 한다.

스레드

스레드는 프로세스 안에서 일을 처리해주는 일꾼으로 스레드 혼자서 처리한다면 싱글 스레드,

둘 이상의 스레드를 사용한다면 멀티스레드라고 부른다.

스레드의 장/단점

[장점]

  • 여러 작업을 동시에 진행할 수 있어 자원을 보다 효율적으로 사용할 수 있다.
  • 응답성이 좋다.

[단점]

  • 구현하기 까다롭다.
  • 테스트하기 어렵다. (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();
}


💡 참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.