Win32 스레드란?
스레드는 윈도우 운영체제에서 실행의 기본 단위입니다. 스레드는 CPU를 소모하는 개별적인 작업 흐름이며, 하나 이상의 스레드가 모여 프로세스를 구성합니다. 이 글에서는 Win32 스레드의 구조, 생성 방식, 동기화 방법 및 상태 관리를 살펴봅니다.
1. 스레드와 프로세스의 개념
개념설명
스레드 | 실행의 단위. 독립적인 실행 흐름과 스택을 가짐. |
프로세스 | 하나 이상의 스레드로 구성된 집합체. 가상 메모리와 권한을 할당받음. |
- 프로세스의 특징
- 운영체제는 새로운 프로세스를 생성하면서 가상 메모리 공간과 권한을 할당.
- 프로세스는 권한 단위로 통제되며, 실행 가능한 주소 공간과 자원을 공유.
- 스레드의 특징
- 프로세스 내에서 생성되며, 프로세스의 가상 메모리 공간을 공유.
- 각 스레드는 독립적인 실행 흐름과 Thread Local Storage (TLS)를 가짐.
2. 가상 메모리와 권한
프로세스가 생성되면 가상 메모리 공간이 할당됩니다. 가상 메모리의 크기는 애플리케이션의 비트 수에 따라 다릅니다.
비트 수가상 메모리 공간 크기
32비트 | 최대 4GB |
64비트 | 최대 16EB (이론상) |
공유와 접근
- 스레드 간 메모리 공유: 동일 프로세스 내 스레드는 가상 메모리를 공유.
- 통제 없음: 특정 스레드는 프로세스 내의 어느 메모리 영역에든 접근 가능.
3. 스레드 생성 및 종료
Win32 API에서 HANDLE ::CreateThread를 사용해 스레드를 생성할 수 있습니다.
스레드 생성 코드 예제
#include <windows.h>
#include <iostream>
// 스레드에서 실행될 함수
DWORD WINAPI ThreadFunction(LPVOID lpParam) {
std::cout << "스레드 실행 중..." << std::endl;
return 0;
}
int main() {
HANDLE hThread;
DWORD threadId;
// 스레드 생성
hThread = CreateThread(
NULL, // 보안 속성 (NULL: 상속)
0, // 스택 크기 (기본값 사용)
ThreadFunction, // 실행할 함수
NULL, // 함수에 전달할 매개변수
0, // 실행 옵션 (0: 바로 실행)
&threadId // 스레드 ID
);
if (hThread == NULL) {
std::cerr << "스레드 생성 실패!" << std::endl;
return 1;
}
std::cout << "스레드 ID: " << threadId << std::endl;
// 스레드 종료
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0;
}
중요한 개념
- 핸들(HANDLE): 스레드나 프로세스를 식별하기 위한 값.
- 보안 속성: NULL로 설정하면 상위 스레드의 보안 속성을 상속.
- 핸들 종료: 스레드 종료 시 반드시 CloseHandle로 핸들을 닫아야 함.
4. 스레드 동기화
여러 스레드가 동시에 리소스에 접근하면 레이스 컨디션 문제가 발생할 수 있습니다. 이를 해결하기 위해 동기화 메커니즘을 사용합니다.
동기화 기법설명
크리티컬 섹션 | 특정 코드 블록에서 동시 접근을 막음. 커널 오브젝트가 아니므로 빠르게 동작. |
이벤트 | 신호를 기반으로 스레드 간의 실행 순서를 제어. |
뮤텍스(Mutex) | 프로세스 간 리소스 접근을 제어. |
세마포어(Semaphore) | 리소스의 최대 접근 가능 수를 지정. |
5. 스레드 상태
스레드는 다양한 상태를 가집니다. 상태 전환은 운영체제에 의해 관리되며, 필요에 따라 프로그래머가 제어할 수 있습니다.
상태설명
RUN | 실행 중인 상태. |
SUSPENDED | 일시 중단 상태. ResumeThread 호출로 실행 가능. |
SLEEP | 지정된 시간 동안 실행 중단. |
Alertable Wait | 특정 조건에서 SUSPENDED 상태를 깨어나게 할 수 있는 상태. |
'프로그래밍 > 소켓 프로그래밍 입문' 카테고리의 다른 글
TCP 서버 소켓 프로그래밍에서 SOCKET 설정 (0) | 2025.01.08 |
---|---|
TCP 에코 서비스: 흐름과 동작 원리 (0) | 2025.01.08 |
TCP 상태 다이어그램과 상태전이 (0) | 2025.01.07 |
소켓의 본질: 소켓은 파일이다. (0) | 2025.01.07 |
작업자 스레드 동기화 (0) | 2025.01.07 |