스레드의 일생과 상태 변화
.Net 프레임워크는 스레드의 상태를 ThreadState 열거형에 정의해두었습니다.
상태 | 설명 |
Unstarted | 스레드 객체를 생성한 후 Thread.Start() 메소드가 호출되기 전의 상태입니다. |
Running | 스레드가 시작하여 동작 중인 상태를 나타냄. Unstarted 상태의 스레드를 Thread.Start() 메소드를 통해 이 상태로 만들 수 있음 |
Suspended | 스레드의 일시 중단 상태를 나타냄. 스레드를 Thread.Suspend() 메소드를 통해 이 상태로 만들 수 있으며, Suspended 상태인 스레드는 Thread.Resume() 메소드를 통해 다시 Running 상태로 만들 수 있습니다. |
WaitSleepJoin | 스레드가 블록(Block)된 상태를 나타냄. 이름이 WaitSleepJoin인 이유는 1. Monitor.Enter() 2. Thread.Sleep() 3. Thread.Join() 메소드를 호출하면 이 상태가 되기 때문임 |
Aborted | 스레드가 취소된 상태를 나타냄. Thread.Abort() 메소드를 호출하면 이 상태가 됩니다. Aborted 상태가 된 스레드는 다시 Stopped 상태로 전환되어 완전히 중지됩니다. |
Stopped | 중지된 스레드의 상태를 나타냄. 스레드를 중지시키는 메소드를 호출하거나 스레드가 실행 중인 메소드가 종료되면 이 상태가 됩니다. |
Background | 스레드가 백그라운드로 동작하고 있는 상태를 나타냄. foreground 스레드는 하나라도 살아있는 한 프로세스가 죽지 않지만, backgroud는 하나가 아니라 열 개가 살아 있어도 프로세스가 죽고 사는 것에는 영향을 미치지 않습니다. 하지만 프로세스가 죽으면 백그라운드 스레드들도 모두 죽습니다. Thread.IsBackgroud 속성에 true 값을 입력함으로써 스레드를 이 상태로 바꿀 수 있습니다. |
외울게 많아서 당황스럽지만 규칙이 있습니다.
예를 들어 Aborted 상태의 스레드는 절대 Running 상태로 전이되지 못하고, Running 상태의 스레드는 Unstarted 상태로 바뀔 수 없습니다
Flags 애트리뷰트
Flags는 자신이 수식하는 열거형을 비트 필드, 즉 플래그 집합으로 처리할 수 있음을 나타냅니다.
열거형
평범한 열거형은 열거 요소에 대응하는 값들만 표현합니다.
enum DaysOfWeek {
Sunday, // 0
Monday, // 1
Tuesday // 2
}
Console.WriteLine((DaysOfWeek)0); // Sunday
Console.WriteLine((DaysOfWeek)1); // Monday
Console.WriteLine((DaysOfWeek)2); // Tuesday
//열거 요소에 대응하지 못하는 값은 형변환을 해도 원래 값으로 표현됩니다.
Console.WriteLine((DaysOfWeek)3); // 3
Console.WriteLine((DaysOfWeek)4); // 4
비트필드
Flags 애트리뷰트를 갖는 열거형은 요소들의 집합으로 구성되는 값들도 표현할 수 있습니다.
enum DaysOfWeek {
Sunday, // 0
Monday, // 1
Tuesday, // 2
Wednesday // 3
}
Console.WriteLine((DaysOfWeek)0); // Sunday
Console.WriteLine((DaysOfWeek)1); // Monday
Console.WriteLine((DaysOfWeek)2); // Tuesday
Console.WriteLine((DaysOfWeek)3); // Wednesday
//Flags 애트리뷰트는 열거형의 요소들의 집합으로 구성되는 값들도 표현할 수 있습니다.
Console.WriteLine((DaysOfWeek)4); // Monday, Wednesday
Console.WriteLine((DaysOfWeek)5); // Tuesday, Wednesday
스레드는 동시에 두 가지 이상의 상태를 가질 수 있습니다.
그래서 예를 들어 Suspended 상태이면서 WaitSleepJoin 상태를 가질 수도 있습니다.
ThreadState는 두 가지 이상의 상태를 동시에 표현하기 위해 이 Flags 애트리뷰트가 수식되어 있는 겁니다.
다음 코드는 Thread 객체의 ThreadState 필드의 값을 확인하는 예제입니다.
if ( t1.ThreadState & ThreadState.Aborted = ThreadState.Aborted)
Console.WriteLine("스레드가 정지했습니다.");
if ( t1.ThreadState & ThreadState.Stopped = ThreadState.Stopped)
Console.WriteLine("스레드가 취소되었습니다.");
'C# 프로그래밍' 카테고리의 다른 글
[C#] Action 대리자와 Func 대리자 (0) | 2023.03.16 |
---|---|
[C#] 스레드 사용법(2) (0) | 2023.03.14 |
[C#] 스레드 사용법(1) (0) | 2023.03.13 |
프로세스와 스레드에 대한 이론 정리글(1) (feat. chat gpt) (0) | 2023.03.09 |
[C#] 직렬화 (0) | 2023.03.07 |