뇌를 자극하는 윈도우즈 시스템 프로그래밍(저자, 윤성우)
01. 쓰레드 풀에 대한 이해
쓰레드의 생성과 소멸은 시스템에 많은 부담을 주기 때문에, 잦은 쓰레드 생성과 소멸은 피해야 한다. 이러한 일을 막기 위해서 쓰레드 풀을 사용할 수 있는데, 쓰레드 풀은 쓰레드의 재활용이 주요 개념이다.
할당된 일을 마친 쓰레드를 소멸시키지 않고, 풀에 저장해두었다가 필요할 경우 다시 꺼내 사용한다.
쓰레드 풀은 처리해야 할 일이 등록되기 전에 생성된다. 풀이 생성되면, 쓰레드도 생성되면서 풀에서 대기 상태에 놓이게 된다. 유연한 풀은 처리해야 할 일의 증가 및 감소에 따라 쓰레드의 개수를 늘리거나, 줄이기도 한다.
02. 쓰레드 풀의 구현
// Thread Pool
typedef void (*WORK) (void);
typedef struct __WorkerThread
{
HANDLE hThread;
DWORD idThread;
} WorkerThread;
struct __ThreadPool
{
WORK workList[WORK_MAX];
WorkerThread workerThreadList[THREAD_MAX];
HANDLE workerEventList[THREAD_MAX];
DWORD idxOfCurrentWork;
DWORD idxOfLastAddedWork;
DWORD threadIdx;
} gThreadPool;
// WORK
void function(void);
쓰레드에 일을 시키기 위한 작업의 기본 단위는 WORK다. 쓰레드에게 일을 시키기 위해서는 하나의 함수가 필요한데, 이때 정의되는 함수는 반환형과 매개변수 타입이 모두 void여야 한다.
위에서 소개한 WorkerThread 구조체는 쓰레드 정보를 담기 위한 역할을 한다. 지금 정의에서는 쓰레드의 핸들과 ID 정보만 담도록 구성되어 있으나, 필요에 따라 확장하면 된다.
그리고 _ThreadPool 구조체는 typedef 선언 없이 자료형 선언과 동시에 전역 변수 형태로 gThreadPool을 선언하고 있다. 안의 멤버들은 두 부류로 나뉘는데, 하나는 일Work에 관련된 멤버들이고 다른 하나는 쓰레드에 관련된 멤버들이다.
// 일Work에 관련된 멤버
WORK workList[WORK_MAX];
DWORD idxOfCurrentWork; // 대기 1순위 Work Index
DWORD idxOfLastAddedWork; // 마지막 추가 Work Index + 1
workList는 일에 해당하는 함수 Work를 등록하는 저장소의 역할을 하고, idxOfLastAddedWork는 마지막에 추가된 Work Index보다 1 많은 값을 유지하면서 새로운 Work의 등록 위치를 가르키고 있다. idxOfCurrentWork는 처리되어야 할 Work의 위치를 가르킨다. 그림로 정의하면 다음과 같다.
// 풀에 저장된 쓰레드와 관련된 멤버
WorkerThread workerThreadList[THREAD_MAX];
HANDLE workerEventList[THREAD_MAX];
DWORD threadIdx;
풀에 저장된 쓰레드 정보는 workerThreadList에 저장한다. workerEventList는 각 쓰레드 별로 하나씩 할당되는 이벤트 동기화 오브젝트를 저장하고 있는 배열이다. workerThreadList[3]에 등록된 쓰레드는 workerEventList[3]에 저장된 이벤트 동기화 오브젝트와 함께 쌍을 이룬다. 마지막으로 threadIdx는 저장된 쓰레드의 개수 정보를 가지고 있다.
workerEventLIst는 쓰레드의 상태를 관리하여 일이 없을 경우, 새로운 일을 부여하거나 휴식 상태에 있게 만드는 역할을 하기 때문에 하나의 쓰레드에 하나의 이벤트 오브젝트가 필요하다.
▶ 위 쓰레드 풀의 문제점
: idxOfCurrentWork와 idxOfLastAddedWork는 증가하되, 감소하지 않는다. 이를 해결하기 위해서 원형 형태로 만들어서 일정 값을 벗어났을 경우, 다시 처음으로 돌리면 된다.
'독서 > 뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
[스터디] 시스템 프로그래밍 - Chapter 16. 컴퓨터 구조의 4번째 이야기 (1) | 2023.11.28 |
---|---|
[스터디] 시스템 프로그래밍 - Chapter 14. 쓰레드 동기화 기법 2 (1) | 2023.11.08 |
[스터디] 시스템 프로그래밍 - Chapter 13. 쓰레드 동기화 기법 1 (1) | 2023.11.08 |
[스터디] 시스템 프로그래밍 - Chapter 12. 쓰레드의 생성과 소멸 (2) | 2023.11.01 |
[스터디] 시스템 프로그래밍 - Chapter 11. 쓰레드의 이해 (3) | 2023.10.30 |