C#에서 스레드를 다루는 방법은 크게 두 가지가 있습니다. 첫 번째는 Thread 클래스를 사용하는 방법이고, 두 번째는 ThreadPool 클래스를 사용하는 방법입니다.
1. Thread 클래스
Thread 클래스는 스레드를 생성하고 관리(제어)하는 데 사용됩니다. Thread 클래스를 사용하여 스레드를 생성하려면, ThreadStart 델리게이트 또는 ParameterizedThreadStart 델리게이트를 사용하여 스레드가 실행할 메서드를 지정해야 합니다.
using System;
using System.Threading;
class ThreadTest
{
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(ThreadProc));
t1.Start();
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Main thread: " + i);
Thread.Sleep(0);
}
t1.Join();
Console.WriteLine("스레드 종료!");
}
static void ThreadProc()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: " + i);
}
}
}
2. ThreadPool 클래스
ThreadPool 클래스는 스레드 풀을 관리하는 데 사용됩니다. 스레드 풀은 미리 생성된 스레드의 집합으로, 스레드를 생성하고 관리하는 오버헤드를 줄일 수 있습니다. ThreadPool 클래스를 사용하여 스레드를 실행하려면, WaitCallback 델리게이트를 사용하여 스레드가 실행할 메서드를 지정해야 합니다.
using System;
using System.Threading;
class ThreadPoolTest
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Main thread: " + i);
Thread.Sleep(0);
}
Console.WriteLine("스레드 종료!");
}
static void ThreadProc(object state)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: " + i);
}
}
}
스레드 동기화
여러 스레드가 공유 자원에 접근할 때는 동기화를 사용하여 데이터 경쟁을 방지해야 합니다. C#에서는 lock 문, Monitor 클래스, Mutex 클래스 등을 사용하여 스레드 동기화를 할 수 있습니다.
스레드를 사용할 때 주의 사항
.NET은 스레드를 제어하는 클래스로 System.Threading.Thread를 제공합니다.
using System;
using System.Threading; // 스레드 사용을 위한 네임스페이스
namespace BasicThread
{
class MainApp
{
static void DoSomething() // 스레드에서 실행될 메서드
{
for (int i = 0; i < 5; i++) // 0부터 4까지 5번 반복
{
Console.WriteLine($"DoSomething : {i}"); // "DoSomething : {i}" 출력
Thread.Sleep(10); // 10밀리초 동안 스레드 실행 중지
}
}
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(DoSomething)); // DoSomething 메서드를 실행할 스레드 t1 생성
Console.WriteLine("Starting thread..."); // "Starting thread..." 출력
t1.Start(); // 스레드 t1 시작
for (int i = 0; i < 5; i++) // 0부터 4까지 5번 반복
{
Console.WriteLine($"Main : {i}"); // "Main : {i}" 출력
Thread.Sleep(10); // 10밀리초 동안 메인 스레드 실행 중지
}
Console.WriteLine("Wating until thread stops..."); // "Wating until thread stops..." 출력
t1.Join(); // 스레드 t1이 종료될 때까지 기다림
Console.WriteLine("Finished"); // "Finished" 출력
}
}
}
코드 설명
이 C# 코드는 Thread 클래스를 사용하여 스레드를 생성하고 실행하는 방법을 보여주는 예제입니다.
DoSomething() 메서드는 스레드에서 실행될 메서드입니다. 0부터 4까지 5번 반복하면서 "DoSomething : {i}"를 출력하고 10밀리초 동안 스레드 실행을 중지합니다.Main 메서드에서는 DoSomething 메서드를 실행할 스레드 t1을 생성합니다. t1.Start() 메서드를 호출하여 스레드를 시작합니다.t1.Join() 메서드를 호출하여 스레드 t1이 종료될 때까지 기다립니다.t1이 종료되면 "Finished"를 출력합니다.출력 결과
Starting thread...
Main : 0
DoSomething : 0
Main : 1
DoSomething : 1
Main : 2
DoSomething : 2
Main : 3
DoSomething : 3
Main : 4
DoSomething : 4
Wating until thread stops...
Finished
참고
Thread 클래스는 스레드를 생성하고 관리하는 데 사용됩니다.ThreadStart 델리게이트는 스레드가 실행할 메서드를 나타냅니다.Start() 메서드는 스레드를 시작합니다.Sleep() 메서드는 지정된 시간 동안 스레드 실행을 중지합니다.Join() 메서드는 스레드가 종료될 때까지 기다립니다.실제로 스레드가 메모리에 적재되는 시점은 t1.Start() 메서드를 호출했을 때입니다. Thread 클래스의 인스턴스는 '준비'만 해둘 뿐입니다ㅏ.
t1.Start() 메서드가 호출되고 나면, CLR은 스레드를 실제로 생성하여, DoSomething() 메서드를 호출합니다.
t1.Join() 메서드는 블록되어 있다가 DoSomething() 메서드의 실행이 끝나면(t1 스레드의 실행이 끝나면), 반환되어 다음 코드를 실행할 수 있게 합니다.
즉, t1.Start() 메서드가 호출하여, t1 스레드가 실행되어 메인 스레드에서 분기됩니다.
t1.Join() 메서드를 실행하여 t1 스레드가 완전히 정지할 때까지 대기합니다. Join() 메서드가 반환되고 나면, 프로그램의 프름은 다시 메인 스레드 하나로 합쳐집니다.