스레드란 명령어를 실행하기 위한 스케줄링 단위
윈도우는 프로세스를 생성할 때 기본적으로 한 개의 스레드를 함께 생성(메인 스레드)
프로그램 실행 종료에 영향을 미치는 스레드를 가리켜 전경 스레드(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 |