본문 바로가기
IT/트렌드&개념공부&TIP

Thread(스레드)

by Andante con moto 2021. 5. 4.
728x90
반응형

1. 스레드란?

  1) 하나의 프로그램 내에서 독립적으로 실행되는 함수

  2) 한순간에 두 개의 함수가 동시에 실행되면 두 개의 스레드가 동작하는 것이다.

  3) 일반적인 프로세스의 경우 한순간에 하나의 함수만 실행되지만, 스레드를 이용하면 여러 개의 함수를 동시에 실행시킬 수 있다.

 

2. 스레드 생성 시 주의사항!

  1) 우선권

  2) 동기화

  3) 동시에 두 개 또는 여러 개의 함수가 실행되지 때문에 어느 함수에게 작업할 권한을 많이 줄 것인지에 대해서 생각해 보아야 한다.

  4) 우선권보다도 더 중요한 것이 바로 공유 자원의 문제이다.

두 개의 함수가 동시에 작업을 진행할 때 둘 다 하나의 자원을 상대로 작업을 하면 미세한 문제가 발생한다.

예를 들어 은행 계좌에 10000원이 있다고 가정할 때, 이 계좌를 A와 B라는 두 사람이 공동으로 이용한다고 하자. 그런데 공교롭게도 A와 B가 서로 다른 장소에서 A는 돈을 인출하려고 하고 B는 돈을 입금하려 한다고 가정하자.

A와 B가 거의 동시에 작업을 진행한다면 은행 시스템은 A나 B 둘 중 한사람을 먼저 처리한 후에 다른 사람을 처리해야 올바른 작업이 이루어질 것이다. 만약 이것을 지키지 않는다면 아주 심각한 문제가 발생한다.

A와 B가 둘 다 동시에 은행 계좌를 읽어가고 작업을 했다면 둘 다 10000원으로 작업을 할 수도 있다. 이렇게 되면 계좌의 돈 계산은 엉망이 될 것이다. A가 먼저 하든지 B가 먼저 하든지 순서를 지키면서 작업을 해야 한다.

이렇게 하나의 자원을 상대로 순서대로 작업이 처리되는 것을 보장하는 기법을 "동기화"라고 한다. 공유자원을 상대로 순서대로 작업이 이루어지는 것을 "동기화가 보장된다"라고 한다.

3. 스레드의 상태

생성 직후의 상태(Unstarted) -> 실행 가능한 상태(Runnable) -> 대기상태(Suspended) -> 실행을 끝내고 죽는 상태(Stopped)

  1) 생성 직후의 상태(Unstarted) 

     - 스레드에 해당하는 함수를 디자인하고, 이 함수의 대리자인 ThreadStart 델리게이트를 생성한다. 그리고 생성된 ThreadStart  델리게이트를 매개변수로 하여 Thread를 생성하게 된다.

  2) 실행 가능한 상태(Runnable)

     - 새로운 스레드가 생성되어 그 스레드의 Start()함수를 호출하면 Runnable상태가 된다.

  3) 대기상태(Suspended)

     - 현재 실행중인 스레드에서 Suspend(), Sleep() 함수를 호출하게 되면 스레드는 Runnable상태에서 Suspended상태로 전환하게 된다.

  4) 실행을 끝내고 죽는 상태(Stopped)

     - 스레드는 하나의 실행 단위이다. 따라서 스레드가 할 일을 모두 마치면 스레드는 Stopped상태가 된다. 또한 작업 도중에 Abort() 함수를 호출해도 스레드는 종료하게 된다. 이렇게 해당 스레드의 함수가 끝나거나 리턴된 경우 또는 강제로 종료될 경우 스레드는 Stopped상태가 된다.

 

4. Thread 클래스에 정의된 함수

  1) Thread.Start() : 해당 스레드의 실행

  2) Thread.Abort() : 해당 스레드의 종료

  3) Thread.Join() : 해당 스레드의 실행 종료 시까지 대기

  4) Thread.Suspend() : 해당 스레드를 대기상태로 변경

  5) Thread.Resume() : 해당 스레드를 실행 상태로 변경

  6) Thread.Sleep() : 해당 스레드를 특정 시간동안 대기상태로 변경

 

5. Thread.ThreadState와 동작

  1) Unstrated : 스레드의 초기 생성단계

  2) Running : 스레드에서 Start 호출, 스레드가 실행 중, 스레드에서 Resume 호출

  3) WaitSleepJoin : 스레드에서 Sleep 호출, 스레드에서 Wait 호출, 스레드에서 Join 호출

  4) SuspendRequest : 스레드에서 Suspend 호출

  5) Suspended :  스레드가 Suspend 요청에 응답

  6) AbortRequested : 스레드에서 Abort 호출

  7) Stopped : 스레드가 Abort 요청에 응답, 스레드가 종결

 

6. Thread 클래스의 속성

  1) Thread.CurrentThread : 현재 실행 중인 스레드를 반환

  2) Thread.IsAlive : 해당 스레드의 실행 여부를 반환

  3) Thread.Name : 해당 스레드의 이름을 설정하거나 반환 

  4) Thread.IsBackground : 해당 스레드가 백그라운드 스레드인지의 여부를 반환

  5) Thread.ThreadState : 해당 스레드의 상태를 반환

  6) Thread.Priority : 해당 스레드의 우선순위를 설정하거나 반환

 

7. 스레드의 Priority

  1) 여러 개의 멀티 스레드가 동작할 때 스레드들은 동시에 동작하는 것처럼 보이지만 한순간에 하나의 스레드만이 CPU를 점유하게 된다.
    그리고 시간이 지나면 다른 스레드가 CPU를 점유할 것이다. 그렇다면 과연 어떤 스레드가 CPU의 자원을 확보할 가능성이 높을까? 이러한 스레드의 실행 기준을 스레드의 우선권(Priority)이라고 한다.

  2) thread1.Priority = ThreadPriority.Highest;

    - Highest          : 스레드가 가장 높은 우선권을 가진다. 

    - AboveNormal : 스레드가 높은 우선권을 가진다.

    - Normal           : 스레드가 평균의 높은 우선권을 가진다.

    - BelowNormal : 스레드가 낮은 우선권을 가진다.

    - Lowest           : 스레드가 가장 낮은 우선권을 가진다.

 

8. Thread 클래스

  1) System.Threading.Thread  

  2) public sealed class Thread

  3) 스레드를 만들고 제어하고, 스레드의 우선순위를 설정하고 스레드의 상태를 가져오는 클래스

  4) Thread는 sealed 즉 상속 금지 클래스로 선언되어 있다. 이 말은 직접 상속해서 사용할 수 없다는 뜻이다. 따라서 스레드를 만들고 제어하기 위해서는 오직 Thread 클래스의 객체를 생성한 후 이용하는 방법뿐이다. 그리고 스레드로 사용할 함수를 참조하기 위해 ThreadStart 델리게이트를 이용해야 한다.

Thread 생성방법
 -> 예제 참고
        //객체생성
		Top t = new Top();

        //객체내의함수를이용해서ThreadStart 델리게이트를생성
		ThreadStart ts = new ThreadStart(t.SayHello);

        //생성된ThreadStart 객체를이용해서Thread생성
		Thread thread= new Thread(ts);	

        //스레드의시작
		thread.Start();
		Console.Write("Thread " + Thread.CurrentThread.GetHashCode() + "메인종료\n" );

 

9. 스레드를 대기상태로 보내는 방법 1 - Sleep()

  1) 지정한 시간(millisecond) 동안 스레드를 대기상태로 만듦

  2) 지정된 시간이 지나면 자동으로 Runnable 상태가 된다.

 

10. 스레드를 대기상태로 보내는 방법 2 - Suspend()

  1) 스레드를 대기상태로 보낸다.

  2) 다시 실행상태가 되기 위해서는 Resume() 함수를 호출해야 한다.

  3) Resume()을 호출하지 않으면 스레드는 Runnable 상태로 되돌아올 수 없다.

  4) .NET Framework 2.0에서 obsolete 되었다. <- 사용 안 한다는 의미

 

11. 멀티 스레드

  1) 스레드를 여러 개 생성하는 것.

  2) 문제점

    - 병목현상, 데드락 병목현상 : 여러 개의 스레드들이 동시에 하나의 자료를 사용하다 보면 자료를 서로 차지하려는 현상

    - 데드락 : 하나의 자원을 여러 곳에서 요청하게 될 때 자원을 한쪽에서는 무한히 사용하고 있으면 다른 한쪽에서는 무한히 대기하는 데드락

 

12. 스레드 종료 : thread.Abort()

  1) 스레드는 ThreadStart 델리케이트에 등록되어 있는 함수가 종료하면 자동으로 종료된다.

  2) Abort() 함수는 스레드를 완전히 죽인다. 이 말은 죽인 스레드 객체를 이용해서 다시 스레드를 시작할 수 없다는 것이다.

 

728x90
반응형

댓글