1. Windows에서의 쓰레드 생성과 소멸

* 쓰레드의 생성

: 쓰레드를 생성할 수 있는 최대 개수는 메모리가 허용하는 만큼이다.

: 쓰레드의 흐름은 예측할 수 없다. 누가 먼저 실행될 것인지 예측하는 것은 의미가 없다.

: Sleep 함수 -> 자신에게 현재 할당된 타임슬라이스를 포기하고 해당 시간동안 우선순위가 같은 다른 쓰레드에게 실행의 기회를 양보한다.

* 쓰레드의 소멸

: 쓰레드 함수 내에서 return으로 소멸시키는 것이 가장 이상적이다.

case 1 : 쓰레드 종료시 return을 이용하면 좋은 경우(거의 대부분의 경우)

: 1~10까지 더하는 상황을 가정했을 때 (I/O 작업이 발생한다고 가정)

: 이를 세개의 쓰레드에서 나눠서 진행한다면, 정해진 시간 동안에 CPU에게 보다 많은 일 시킬 수 있고, Blocked 상태에 놓이는 경우도 나눠서 감당하기 때문에 속도가 높아질 확률이 높다.

: 구현은 쓰레드에 나누어 실행 시킨뒤에 쓰레드의 커널 오브젝트를 관찰하여 종료되었을 때 메인 쓰레드에서 감지하고 종료한다.

case 2 : 쓰레드 종료 시 ExitThread 함수 호출이 유용한 경우(특정 위치에서 쓰레드의 실행을 종료시키고자 하는 경우)

: 언제 어디서나 쓰레드를 종료시킬 수 있지만, 메모리 누수현상이 일어날 수 있다.

: 하지만, 특정 함수가 호출되었을 때 종료시키고 싶다면, 유용하다.

case 3 : 쓰레드 종료 시 TerminateThread 함수 호출이 유용한 경우(외부에서 쓰레드를 종료시키고자 하는 경우)

: 강제 종료이기 때문에 사용하면 좋지 않다.

2. 쓰레드의 성격과 특성

* 힙, 데이터 영역, 그리고 코드 영역의 공유에 대한 검증

: 쓰레드 끼리 공유하고 있는 total 이라는 전역변수에 직접 결과값을 더함으로써 처리해야하는 코드 양이 줄었다,

* 동시접근에 있어서의 문제점

:  하지만 실제로는 total 값을 불러와서 레지스터에 저장한 뒤, 연산하고 다시 total에 저장하려고 할때 블럭킹되어 다른 쓰레드가 실행된 뒤 total에 값을 저장하게 되어, 연산 값이 제대로 반영되지 않는 경우가 다반사 이다.

: 실제로 Context Switching은 빈번하게 나타나며, 메모리 영역을 동시에 참조하는 것은 문제를 일으킬 가능성이 매우 높다.

* 프로세스로부터의 쓰레드 분리

: 쓰레드도 프로세스와 마찬가지로 생성될 때 Usage Count가 2가 된다. 따라서 CloseHandle함수를 곧바로 호출 함으로써 프로세스로부터 쓰레드를 분리할 수 있다.

: 그래야 쓰레드의 종료시점이 쓰레드의 소멸시점이 된다.

* ANSI 표준 C라이브러리와 쓰레드

: 마이크로소프트에서는 멀티 스레드에 안전한 ANSI 표준 라이브러리를 제공하고 있다. 

: CreateThread라는 함수 대신에 _beginthreadex 함수를 사용한다. 독립적인 메모리 블록을 할당한다는 차이점이 있다.

: 라이브러리에서 제공하는 함수를 사용하는 것이 안전하다.

3. 쓰레드의 상태 컨트롤

: 쓰레드의 상태는 운영체제가 관리하나, 필요에 따라서 프로그래머가 변경하는 경우도 발생한다.

* 쓰레드의 상태 변화

: 프로세스와 동일하게 이해하면된다.

: Running, Ready, Blocked

* Suspend & Resume

: SuspendThread는 Blocked 상태에 두는 함수이고 ResumeThread는 Ready 상태에 두기 위한 함수이다.

: SuspendThread 함수가 호출되면 해당 쓰레드의 커널 오브젝트에 SuspendCount(디폴트는 0)이 증가하고 Blocked상태가 된다. 반면 ResumeThread는 SuspendCount를 감소시키는 함수인데, 만약 SuspendThread 함수가 두번 호출되었다면, ResumeThread가 두번 호출되어 SuspendCount를 0으로 만들어야 쓰레드가 Ready 상태가 된다.

: 쓰레드 생성시 SuspendCount를 1로 두어 Blocked상태로 생성할 수 있다.

4. 쓰레드 우선순위 컨트롤    

: 사실 우선순위는 프로세스가 가지는 것이아니라, 쓰레드가 가진다.

: 프로세스는 기준 우선순위를 가지며, 쓰레드가 가지는 상대 우선순위와 결합하여 쓰레드의 우선순위가 결정된다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기



+ Recent posts