.NET 에서Threading 라는 단어를 떠올리면 좀 막막하다거나 혹은 어디다 써먹지 하는 생각이 떠오릅니다. 그렇지만 이것 역시 개발시 거르지 않고 항상 사용하게 되는 핵심 기반 기술입니다.

Multi-Threading 이라고 하면 예전에는 서버 시스템을 구축할 때나 힘겹게 사용하던 개발 기술입니다만 요즘은 개인PC에도 하이퍼스레딩이나 다중 프로세서가 일반화된 상황이다보니 MultiThread는 뛰어난 성능의 프로그램을 만들고자하는 개발자에게는 필수 지식이 되었습니다.

Thread가 뭔가 하는 물음에 대해서는 아래 설명 및 예제들을 통해서 자연스럽게 받아들일 수 있다면 좋겠습니다.

 Thread 생성

    - 별도의 Thread로 실행시킬 Method 생성( DoSomething )

    - ThreadStart delegate(대리자) 정의

       : Thread의 Start 메소드 호출 시 실행될 메소드(DoSomething)를 등록합니다.

    - Thread 개체 생성

       : 앞서 생성한 ThreadStart delegate 개체를 생성자 파라메터로 줍니다.

    - 앞단계에서 생성한 Thread개체의 Start 메소드 호출

       : DoSomething 메소드는 이제 Main이 실행중인 Thread와 다른 새로운 Thread에서 실행되게

         됩니다.

아래 코드예를 참고하세요.

 

Multiple Threads

이번에는 DoSomething 메소드를 여러개의 다른 Thread로 실행하도록 해보겠습니다. 앞의 예제보다는 이것이 더 현실적일 거 같습니다. MultiThread로 실행시킬 일이 없다면 굳이 별도의 Thread로 실행시킬 이유도 없겠죠.

아래는 결과 화면입니다. DoSomething이 10개의 별도 Thread로 실행되었습니다.

위 결과만을 보면 너무 빨리 끝나 버리기도 하고 해서 기능적으로만 보면 단순히 DoSomething을 10번 호출하는 거랑 크게 다르지 않아 보입니다. 그래서 이번에는 효과를 시각적으로 확인할 수 있도록 DoSomething 메소드를 아래와 같이 코드를 수정했습니다.

현재 자신이 실행중인 Thread의 ManagedThreadID를 한번만 출력하던 것을 10번 출력하게 수정했습니다.  매 출력시마다 1/100초동안 멈추었다 다시 실행하도록(Sleep(10)) 했습니다. 생성된 10개의 Thread가 동시에 실행중이라고 한다면 ThreadID 값이 뒤죽박죽 섞여서 출력이 될 것입니다. 그렇지 않다면 각 ThreadID가 동일한 값이 10번씩 출력되겠죠.

아래는 결과 화면입니다.

 

Join

위 코드에 아래와 같이 Console.WriteLine ... 을 추가했습니다. "실행완료?" 라는 문자열이 어느시점에서 뿌려질까요. 아래는 코드 및 결과입니다.

Multi-Threading의 당연한 결과지만 앞서 실행시킨 10개의 Thread가 완료되기 전에 Console.WriteLine..이 실행됐습니다. 그렇지만 현재 Thread가 실행을 완료할 때까지 기다려야 하는 상황이 자주 있습니다. 이럴 경우 사용하는 것이 Thread의 Join 메소드입니다. 아래 코드 예제와 결과를 보세요.

생성된 Thread을 별도로 저장했다가 Console.WriteLine을 호출하기 전에 Join 했습니다. 이는 별도로 실행되던 각 Thread들을 Main의 Thread에 연결함으로써 내가 종료될 때까지 기다려 달라고 말하는 것입니다.

 

ThreadPriority - Thread 실행 우선 순위

Thread들의 실행은 CPU 기능이나 갯수에 따라 다르겠지만 일정한 순서없이 이루어 집니다. 그러나 특정 Thread의 실행순서를 제어해야 하는 상황이 있을 수 있습니다. 이럴 때 사용하는 것이 ThreadPriority 입니다. ThreadPriority 값은 아래와 같습니다.

===================================================================

Highest, AboveNormal, Normal(기본값), BelowNormal, Lowest

===================================================================

우선순위는 신중하게 다루는 것이 좋습니다. 사실 우선순위라는 것 자체가 Multi-Thread의 기본 정신(CPU 자원을 최대한 활용할 수 있도록 동시에 여러 작업을 수행시킨다는)에 위배되는 내용이죠. 특히 주의해야될 상황이 있습니다. 특정 스레드에 우선 순위를 너무 높게 설정할 경우 다른 스레드를 굶겨(CPU시간상)죽이는 경우가 있을 수 있고 물론 그 반대의 상황이 발생할 수도 있습니다.

 

Thread의 중단 & ThreadAbortException

 

 

Execution Context

[출처] Threading - (1) 기초|작성자 유후


Posted by penguindori