뽕구의 개발일지

[C#] Thread 쓰레드 - 기본개념 본문

개발 일지/C#

[C#] Thread 쓰레드 - 기본개념

뽕구 2025. 4. 23. 07:34
728x90
반응형

안녕하세요.

이번에는 C#으로 쓰레드 Thread에 대해 알아보도록 하겠습니다.

쓰레드 Thread

Thread(쓰레드) 는 CPU가 작업을 수행하는 최소 단위의 실행 흐름입니다.
운영체제 관점에서 하나의 프로세스는 하나 이상의 쓰레드를 가질 수 있으며, 이들 쓰레드는 같은 메모리 공간을 공유합니다.

  • 프로세스(Process): 실행 중인 프로그램
  • 쓰레드(Thread): 그 프로그램 내부에서 실제로 일을 처리하는 실행 흐름

즉, 한 프로그램(프로세스) 안에서도 여러 개의 작업을 동시에 처리하고 싶을 때, 그걸 가능하게 해주는 게 Thread입니다.

 

쓰레드 생성 방법 1

C#에서는 System.Threading.Thread 클래스를 통해 간단히 스레드를 만들 수 있습니다.

 

기본 예시 코드를 작성해봤는데요.

코드 설명은 아래와 같습니다.

  • 0.5초마다 현재 쓰레드 ID와 반복 횟수를 출력하는 PrintNumbes 메서드가 있습니다.
  • Main 함수에서 쓰레드 t를 하나 생성합니다. 
  • t 쓰레드에서 PrintNumbers 메서드를 실행합니다.
  • t 쓰레드를 시작합니다.
  • 메인 쓰레드에서는 "메인 쓰레드는 먼저 실행됩니다." 를 출력합니다.
 
using System;
using System.Threading;

class Program
{
    static void PrintNumbers()
    {
        // 이 메서드는 별도의 쓰레드에서 실행됩니다.
        for (int i = 0; i < 5; i++)
        {
            // 쓰레드 ID를 출력합니다.
            Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] {i}");
            Thread.Sleep(500);
        }
    }

    static void Main()
    {

        Thread t = new Thread(PrintNumbers); // PrintNumbers 메서드를 실행하는 쓰레드 생성
        t.Start(); // 쓰레드 시작

        Console.WriteLine("메인 쓰레드는 먼저 실행됩니다.");
    }
}

 

 

아래는 위 코드의 실행 결과입니다. 

 

메인 쓰레드 먼저 수행되는 것을 볼 수 있네요.

그 후에 PrintNumbers 메서드가 호출되며 0.5초마다 쓰레드 ID를 찍으며 5번 반복합니다.

쓰레드 실행 결과

 

쓰레드 생성 방법 2

쓰레드는 생성 방법이 몇가지 더 있어요.

 

위처럼 메서드를 바로 호출하는 방식과 동일한 ThreadStart,

object 타입 파라미터 1개 넘길 수 있는 ParameterizedThreadStart,

마지막으로 간단히 람다식을 이용한 방식이 있습니다.

 

아래 표로 정리해뒀어요!

방식 설명 사용 예
ThreadStart 
혹은 
메서드 바로 호출
파라미터가 없는 메서드를 실행할 때 사용 new Thread(new ThreadStart(Method))
new Thread(Method)
ParameterizedThreadStart object 타입의 파라미터 1개를
넘길 수 있는 스레드
new Thread(new ParameterizedThreadStart(Method))
람다식 (익명 메서드) 간단한 코드 블럭을 직접 정의할 때 new Thread(() => { ... })

 

 

예시 코드를 한번 작성해봤습니다.

코드 설명은 아래와 같습니다.

  • 기본 방식의 쓰레드 t에서 호출되는 메서드는 "ThreadStart 방식" 을 출력합니다.
  • 파라미터를 받는 쓰레드 t2의 메서드는 Start할때 넘어오는 파라미터를 출력합니다.
  •  t2 쓰레드를 시작하며 파라미터를 전달합니다. t2.Start("Hello from parameter");  
  • 람다식 쓰레드 t3는 0.5초마다 현재 쓰레드 ID와 반복 횟수를 출력합니다.
  • 메인 쓰레드에서는 "메인 쓰레드는 먼저 실행됩니다." 를 출력합니다.
using System;
using System.Threading;

class Program
{
    /// <summary>
    /// ThreadStart 방식으로 쓰레드 생성
    /// </summary>
    static void Method1()
    {
        Console.WriteLine("ThreadStart 방식");
    }

    /// <summary>
    /// ParameterizedThreadStart 방식으로 쓰레드 생성
    /// </summary>
    /// <param name="msg"></param>
    static void Method2(object msg)
    {
        Console.WriteLine($"ParameterizedThreadStart: {msg}");
    }

    /// <summary>
    /// 람다식으로 쓰레드 생성
    /// </summary>
    static void Main()
    {
        // 1. ThreadStart
        // ThreadStart 방식으로 쓰레드 생성
        Thread t1 = new Thread(new ThreadStart(Method1));
        t1.Start();

        // 2. ParameterizedThreadStart
        // ParameterizedThreadStart 방식으로 쓰레드 생성
        Thread t2 = new Thread(new ParameterizedThreadStart(Method2));
        // 파라미터를 전달하는 방법
        t2.Start("Hello from parameter");

        // 3. 람다식
        Thread t3 = new Thread(() =>
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] {i}");
                Thread.Sleep(300);
            }
        });
        t3.Start();

        Console.WriteLine("메인 쓰레드는 먼저 실행됩니다.");
    }
}
 
 
결과는 아래와 같이 출력되네요.
 
메인쓰레드 실행
이어서 t1 t2 t3 쓰레드가 순차적으로 실행됩니다.
 
쓰레드 동작 방식을 보려면 t1 t2 t3 모두 t3처럼 Sleep 주면서 for문을 돌려봐야 확실히 보일것 같아요
 
 
여러 Thread 생성 방식 결과
 
 
아래는 각 쓰레드 호출 메서드에 람다식 쓰레드 t3처럼 for문과 0.5초 딜레이를 주면서 호출했습니다.
 
각 쓰레드에 for문 추가

 

이렇게 해보니까 하나의 프로그램(프로세스)에서 4개의 작업을 동시에 수행했네요!

좀 더 정확히 설명하자면

CPU 스케쥴러가 사용 가능할 때 여러 쓰레드에 각각 할당해서 쓰레드가 돌아간 것입니다. 

이를 시분할 방식이라고 해요.

 

 

 

마치며..

간단한 예제로 알아보았지만 파일 저장, 호출, 네트워크, 병렬처리에 응용하면 더욱 파워풀한 성능을 낼 수 있습니다.

사실 Thread는 요즘,, 잘 안씁니다. 

C# .Net framework 4.5에서 안정적이게 쓰레드풀에서 돌아가는 Task가 나왔기 떼문이죠.

저는 회사에서 개발할때 while문을 써서 계속 상태를 체크해야하는 부분 말고는 비동기처리에 용이한 Task를 사용했습니다.

 

다음 챕터에서는 Task와 Thread를 비교해보고 Task의 사용법도 알아보도록 하겠습니다.

 

그리고 C#에서 쓰레드하면 빠질 수 없는,,, Monitor랑 lock 등등 데드락 관련 개념도 다루도록 하겠습니다! 

 

읽어주셔서 감사합니다!

728x90
반응형

'개발 일지 > C#' 카테고리의 다른 글

[C#] .cs not found  (0) 2024.01.17
[C#] 클래스 - 구조  (2) 2024.01.03
[C#] 기본 자료형  (1) 2023.10.31