본문 바로가기
[2-3]operating system/[2-3.2]Thread

[Thread Book #5] 스레드 상태 조사

by 오늘도 빛나는 너에게 2020. 6. 12.
728x90

[Thread Book #5] 스레드 상태 조사

 

스레드가 가질 수 있는 상태를 설명하며 스레드가 이제 시작됐는지의 여부나 스레드가 봉쇄 상태인지의 여부에 관한 정보를 얻을때 유용하다.

스레드는 독립적으로 실행되므로 언제든지 상태가 바뀔수 있음에 주목하길 바란다.

 

class Program

       {

              static void Main(string[] args)

              {

                     Console.WriteLine("Starting program...");

                     Thread t = new Thread(PrintNumbersWithStatus);

                     Thread t2 = new Thread(DoNothing);

                     Console.WriteLine(t.ThreadState.ToString());

                     t2.Start();

                     t.Start();

                     for (int i = 1; i < 30; i++)

                     {

                           Console.WriteLine(t.ThreadState.ToString());

                     }

                     Thread.Sleep(TimeSpan.FromSeconds(6));

                     t.Abort();

                     Console.WriteLine("A thread has been aborted");

                     Console.WriteLine(t.ThreadState.ToString());

                     Console.WriteLine(t2.ThreadState.ToString());

              }

              static void DoNothing()

              {

                     Thread.Sleep(TimeSpan.FromSeconds(2));

              }

              static void PrintNumbersWithStatus()

              {

                     Console.WriteLine("Starting...");

                     Console.WriteLine(Thread.CurrentThread.ThreadState.ToString());

                     for (int i = 1; i < 10; i++)

                     {

                           Thread.Sleep(TimeSpan.FromSeconds(2));

                           Console.WriteLine(i);

                     }

              }

       }

 

   

 

 

다른 두 스레드를 정의한 메인 프로그램이 시작하면 한 스레드는 중단되고,다른 스레드는 성공적으로 실행된다.

C#의 열거형인 스레드 상태는 Thread 객체의 ThreadState 속성에 있다.

첫 번째 스레드는 ThreadState.Unstarted 상태를 갖는다.

그러면 실행중이라고 가정할때 주기를 30번 반복하는 동안에 스레드는 자신의 상태를 ThreadState.Running 에서 ThreadState.WaitSleepJoin으로 바꾼다.

  • 현재 Thread 객체는 Thread.CurrentTherad 정적 속성을 통해 항상 접근할 수 있음에 주목하길 바란다.

만약에 발생하지 않았다면 반복 횟수를 늘리면 된다.그런 후에 첫 번째 스레드를 중단하면 ThreadState.Aborted 상태를 가짐을 지금 볼수 있다.

프로그램이 ThreadState.AbortRequested 상태를 출력하는 것도 역시 가능하며 두 스레드 동기화의 복잡도를 잘 보여준다.

프로그램에서 스레드 중단을 사용하지 말아야함을 명심해야한다. 여기에서만 스레드 상태를 보여줄 뿐이다

 

끝으로 두 번째 스레드인 T2가 성공적으로 끝났음을 볼수 있으며 지금은 ThreadState.Stopped 상태를 갖는다.

여러 다른 스레드 상태가 있지만, 부분적으로 더 이상 사용되지 않으며 조사했던 것은 어느 정도 유용하지 않다.

 

출처 : C# 멀티스레드 프로그래밍 -유진 아가포노프 -  

728x90

댓글