본문 바로가기
프로그래밍/C#

C# 쓰레드(Thread)에 대해서

by bantomak 2023. 4. 19.
반응형

쓰레드(Thread)란 무엇인가

프로세스(Process)와 쓰레드(Thread)의 차이

프로세스와 쓰레드는 컴퓨터에서 동작하는 작업의 단위입니다.

각각의 작업은 독립적으로 실행되며, 다른 작업에 영향을 미치지 않습니다.

 

  1. 프로세스는 운영체제로부터 자원(메모리, 핸들 등)을 할당받으며, 쓰레드는 프로세스 내부에서 자원을 공유합니다.
  2. 각 프로세스는 독립된 주소 공간을 가지며, 서로의 메모리에 접근할 수 없습니다. 하지만 하나의 프로세스 내에서 여러 쓰레드가 동시에 실행될 경우, 서로의 메모리에 자유롭게 접근할 수 있습니다.
  3. 프로세스는 하나 이상의 쓰레드로 구성될 수 있습니다. 쓰레드는 하나 이상의 프로세스에 속해 있을 수 없습니다.

프로세스와 쓰레드
프로세스와 쓰레드의 관계

멀티 쓰레드(Multi-thread)와 단일 쓰레드(Single-thread)

멀티 쓰레드는 여러 개의 쓰레드가 동시에 실행되는 것을 말하며, 단일 쓰레드는 하나의 쓰레드만 실행되는 것을 말합니다.

단일 쓰레드의 경우 한 번에 하나의 작업만 처리할 수 있으므로, 작업 처리 시간이 오래 걸리거나 무거운 작업을 처리할 때는 전체 시스템 성능에 영향을 미칩니다. 반면 멀티 쓰레드는 여러 개의 쓰레드가 동시에 작업을 처리할 수 있으므로 전체적인 작업 처리 속도가 빨라집니다. 하지만 쓰레드 간의 동기화 및 추가적인 관리가 필요합니다.

 

싱글 쓰레드 멀티 쓰레드

 

쓰레드를 사용하는 이유

  • 응답성 향상
  • 자원 공유
  • 병렬 처리

 

쓰레드 사용시 고려해야할 사항

  • 동기화(Synchronization)
  • 경쟁 조건(Race Condition)
  • 교착 상태(Deadlock)

 

C#에서 쓰레드 사용하기

쓰레드 생성 및 실행

class ThreadTest
{
  static void Main()
  {
    Thread t = new Thread (WriteY);          // Kick off a new thread
    t.Start();                               // running WriteY()
 
    // Simultaneously, do something on the main thread.
    for (int i = 0; i < 1000; i++) Console.Write ("x");
  }
 
  static void WriteY()
  {
    for (int i = 0; i < 1000; i++) Console.Write ("y");
  }
}

 

쓰레드 정지 및 일시정지

Thread.Join 해당 쓰레드가 끝날 때까지 다른 쓰레드를 대기시킵니다.

static void Main()
{
  Thread t = new Thread (Go);
  t.Start();
  t.Join();
  Console.WriteLine("Thread t has ended!");
}
 
static void Go()
{
  for (int i = 0; i < 1000; i++) Console.Write ("y");
}

 

Thread.Sleep 현재 쓰레드를 특정한 시간만큼 일시정지시킵니다.

Thread.Sleep(TimeSpan.FromHours (1));  // sleep for 1 hour
Thread.Sleep(500);                     // sleep for 500 milliseconds

 

Join과 Sleep 메서드는 쓰레드를 블럭시키므로 해당 시간동안 블럭된 쓰레드는 CPU 자원을 소모하지 않습니다.

 

쓰레드 강제종료

static void Main()
{
    Thread t = new Thread(DoWork);
    t.Start();

    Thread.Sleep(5000); // 5초 대기

    if (t.IsAlive)
    {
        Console.WriteLine("강제 종료");
        t.Abort(); // 쓰레드 강제 종료
    }
    else
    {
        Console.WriteLine("정상 종료");
    }
}

static void DoWork()
{
    try
    {
        while (true)
        {
            Console.WriteLine("쓰레드 실행 중...");
            Thread.Sleep(1000); // 1초 대기
        }
    }
    catch (ThreadAbortException ex)
    {
        Console.WriteLine("쓰레드 종료 예외 발생");
        Console.WriteLine(ex.Message);
    }
}

Thread.Abort() 메서드를 사용하면 해당 쓰레드를 강제종료 시킬 수 있습니다.

 

쓰레드 우선순위

static void Main(string[] args)
{
    // 스레드 생성 및 우선순위 설정
    Thread thread1 = new Thread(new ThreadStart(Worker));
    thread1.Name = "Thread 1";
    thread1.Priority = ThreadPriority.Highest;

    Thread thread2 = new Thread(new ThreadStart(Worker));
    thread2.Name = "Thread 2";
    thread2.Priority = ThreadPriority.Lowest;

    // 스레드 시작
    thread1.Start();
    thread2.Start();

    // 메인 스레드가 먼저 종료되지 않도록 스레드가 종료될 때까지 대기
    thread1.Join();
    thread2.Join();

    Console.WriteLine("All threads finished.");
}

static void Worker()
{
    Console.WriteLine("Thread {0} started.", Thread.CurrentThread.Name);

    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine("Thread {0} is working.", Thread.CurrentThread.Name);
        Thread.Sleep(500);
    }

    Console.WriteLine("Thread {0} finished.", Thread.CurrentThread.Name);
}

 

댓글