
메모리에 올라와 실행되고 있는 프로그램의 인스턴스
프로세스 내에서 실행되는 여러 흐름의 단위를 스레드라고 하며, 한 개의 프로세스 내에서 여러 개의 스레드가 독립적으로 수행된다.
두 개 이상의 스레드가 동적하는 것을 멀티 스레드라고 한다
System.Threading 네임 스페이스에서 스레드를 생성, 종료, 제어 기능을 제공하는 Thread 클래스
public sealed class Thread
| 주요 기능 | 내용 |
|---|---|
| Interlocked | 멀티스레드 기반에서 스레드 간에 공유되는 객체를 동기화 |
| Monitor | locks, wait, signals를 통해서 스레드 객체를 동기화 |
| Mutex | 두 개 이상의 스레드가 공유 자원에 동시에 접근할 때 동기화 |
| Thread | 스레드를 생성하고 제어하는 기능을 제공 |
| ThreadPool | 해당 프로세스 내의 스레드들을 관리하는 기능을 제공 |
| Timer | 설정한 시간 간격으로 메소드를 실행하도록 기능을 제공 |
| ThreadStart | 스레드에서 실행되는 메소드를 등록하는 델리게이트 |
| WaitCallback | 스레드 풀에 의해 실행될 콜백 메소드를 나타내는 델리게이트 |
| TimerCallback | 타이머에 의해 호출되는 ㅔㅁ소드를 등록하는 델리게이트 |
| ThreadState | 스레드의 상태를 지정 |
| ThreadPriority | 스레드의 우선순위를 지정 |
스레드 시작: ThreadStart 델리게이트
: 스레드로 사용할 메소드를 참조할 수 있게 해주는 델리게이트는 특정 메소드의 기능을 대신 위임받아서 처리하는 기능을 한다.
ThreadStart ts = new ThreadStart(ThreadFunction);
Thread thd = new Thread(ts);
thd.Start();
주요 메소드
| 메소드 | 설명 |
|---|---|
| Abort() | 이 메소드가 호출되는 스레드에서 ThreadAbortException을 발생시켜 스레드 종료 프로세스를 시작 |
| Join() | 스레드가 종료될 때까지 대기하면서 호출 스레드를 차단 |
| Resume() | 일시 중지된 스레드를 다시 시작 |
| Sleep() | 지정된 시간동안 현재 스레드를 일시 중지 |
| Start() | 현재 스레드 객체를 동작(Running) 상태로 변경 |
| Suspend() | 현재 동작하고 있는 스레드를 일시 중지 |
: 풀은 '웅덩이', '연못'이라는 의미로, 스레드풀은 일정한 양의 스레드를 미리 메모리에 할당시켜놓은 집합이다.
스레드풀은 사용 가능한 작업 스레드를 할당받아 계속 돌려쓰는 방식으로, 스레드를 생성 및 제거하는 작업에는 많은 자원이 소모된다.

이미지에서 처리할 작업 하나하나를 태스크(Task)라고 한다.
: ThreadPool 클래스에서 제공하는 대표적인 메소드가 QueueUserWorkItem()으로, 스레드 실행을 위해 메소드를 큐에 대기시키는 기능을 한다. 큐에 대기중인 메소드는 스레드풀의 스레드를 사용할 수 있을 때 실행한다.
public static bool QueueUserWorkItem(System.Threading.WaitCallback callBack);
여러 곳에서 자원 요청 시, 순서대로 자원을 사용한다는 개념
스레드의 갯수가 많아질수록 문제가 발생하는데, 여러 개의 스레드가 한 개의 공유 자원을 사용할 때 발생한다. 이러한 문제를 해결하려면 공유자원을 질서를 지켜서 사용하면 된다. 이러한 개념을 동기화라고 하며, 동기화를 하는 방법은 lock, Monitor, Mutex 등의 방법이 있다.
Monitor 클래스는 lock문보다 조금 더 정교한 동기화 기법을 제공하는데 임계영역의 시작점과 끝점을 임의적으로 조정할 수 있고, 임계 영역에서 보호받을 공유 자원 설정도 가능하다.
사용방법
// Monitor 요청
Monitor.Enter(lockObject);
// Monitor 해제
Monitor.Exit(lockObject);
Mutex는 상호배제라는 뜻을 가지고 있는데, 공유자원의 동시접근을 막기위한 알고리즘이다.
사용방법
// 객체 생성
Mutex mtx = new Mutex(false, "mtxObj");
// Mutex 요청
mtx.WaitOne();
// Mutex 해제
mtx.ReleaseMutex();