C#

스레딩

연향동큰손 2026. 1. 13. 16:58

 

스레드란 명령어를 실행하기 위한 스케줄링 단위

 

윈도우는 프로세스를 생성할 때 기본적으로 한 개의 스레드를 함께 생성(메인 스레드)

 

프로그램 실행 종료에 영향을 미치는 스레드를 가리켜 전경 스레드(foreground thread)라 한다.

배경 스레드(background) => 프로그램 종료에 영향 X

static void Main(string[] args)
{
    Thread t = new Thread(threadFunc);
    t.IsBackground = true;
    t.Start(); //실행 안됨
}

static void threadFunc()
{
    Console.WriteLine("60초 후에 프로그램 종료");
    Thread.Sleep(1000 * 10);

    Console.WriteLine("스레드 종료!");
}

 

 static void Main(string[] args)
 {
     Thread t = new Thread(threadFunc);
     t.IsBackground = true;
     t.Start();

     t.Join(); //t스레드 종료까지 대기
     Console.WriteLine("주 스레드 종료!");
 }

 static void threadFunc()
 {
     Console.WriteLine("10초 후에 프로그램 종료");
     Thread.Sleep(1000 * 10);

     Console.WriteLine("스레드 종료!");
 }

 

 

 

오래 걸리는 연산에 대한 중도 종료 기능 구현

static void Main(string[] args)
{
    while (true)
    {
        Console.WriteLine("x입력 시 종료");
        string str = Console.ReadLine();
        if (str.Equals("x", StringComparison.OrdinalIgnoreCase) == true)
        {
            Console.WriteLine("프로그램 종료");
            break;
        }
        Thread t = new Thread(DDD);
        t.IsBackground = true; //t스레드는 프로세스 종료에 영향을 안미침
        t.Start(str);
    }
    Console.WriteLine("주 스레드 종료!");
}

static void DDD(object a)
{
    string s = "";
    for(int i=0; i<100000; i++)
    {
        s = s+ "1";
    }

    Console.WriteLine("DDD 종료");
}

 

위 코드를 보면 t스레드를 Background 스레드로 설정하였기 때문에 t스레드의 연산이 실행 중이더라도 x를 누르면 메인 스레드에서 while문을 탈출하고 프로그램이 종료되는 것을 확인할 수 있다.

 

반면 t.IsBackground = true를 주석처리하면 foreground 스레드로 설정이 되어 프로그램 종료에 영향을 미치는 스레드가 된다.

 

따라서 아래 사진과 같이 주 스레드가 종료되어도 프로그램이 종료되지 않고 t스레드가 종료되어야 프로그램이 완전히 종료되는 것을 확인 가능하다.

 

 

멀티 스레드

쿼드코어 CPU에서는 총 4개의 스레드를 동시에 실행할 수 있지만, 윈도우 작업 관리자를 확인해보면 4개 이상의 프로세스가 동시에 실행중임을 확인 가능하다.

 

이것이 가능한 이유는 CPU가 하나의 스레드를 짧은 시간 동안 실행한 후 그 스레드를 멈추고 다음 스레드를 선택해서 실행하는 과정을 반복하기 때문이다.

 

멀티 스레드 환경에서는 유 리소스에 대한 동기화 처리가 매우 중요하다.

 

동기화 처리의 방법중 하나는 공유자원에 대해 한순간에 오직 한 스레드만 접근할 수 있도록 하는 방법이 있다.

 

이를 위해서 BCL에서 Monitor 클래스를 제공한다.

'C#' 카테고리의 다른 글

[C#] LINQ(데이터 쿼리)  (0) 2026.02.19
BCL  (0) 2026.01.10
[C#] 대리자(delegate)  (0) 2026.01.08
[C#] Collection / Generic Collection  (0) 2026.01.04