같은편
홍익대 게임소프트웨어전공의 프로그래밍 단련 공간
같은편
깃허브 주소
https://github.com/madongchan
GitHub 아이콘
  • 분류 전체보기 (85)
    • 게임 프로그래밍 패턴 (2)
    • C# 프로그래밍 (26)
    • C++ 프로그래밍 (32)
      • 함수 (8)
      • 클래스 (22)
    • 알고리즘 공부 (2)
      • codingame 사이트 문제 (11)
    • 유니티엔진 - 게임 공부 (3)
    • 언리얼엔진 - 게임 공부 (4)
    • 쓸모 있을 수 있는 팁 (2)
    • 일상이야기 (3)

최근 댓글

태그

  • c++
  • 스레드
  • 탐욕 알고리즘
  • 클래스
  • 알고리즘
  • 람다식
  • 언리얼
  • 언리얼엔진
  • DFS
  • 복사 생성자
  • 문제 풀이
  • 최단 경로
  • 비동기
  • C#
  • 언리얼엔진4
  • task
  • 예외 처리
  • queue
  • 함수
  • 객체

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
같은편

홍익대 게임소프트웨어전공의 프로그래밍 단련 공간

프로세스와 스레드에 대한 이론 정리글(2)
C# 프로그래밍

프로세스와 스레드에 대한 이론 정리글(2)

2023. 3. 13. 17:51

스레드의 일생과 상태 변화

.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
    같은편
    같은편
    책을 통해 이때까지 블로그나 유튜브에서 얻었던 지식의 파편들을 정립하고 합쳐 단단한 발판으로 만들기 위한 블로그

    티스토리툴바