[WIN32 API] 10. 멀티스레드
10. 멀티스레드
⠂스레드 : 컴퓨터가 연속된 명령어를 차례로 하나씩 처리하는데, 이렇게 처리되는 명령어의 흐름. 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드라고 한다.
⠂프로젝트 설정
C런타임 라이브러리 process.h 파일 포함 -> _beginthreadex() 함수를 이용하여 Win32 API환경에서 멀티스레드 프로그램 작성을 위해
프로젝트 환경에 멀티스레드 DLL 설정 -> 프로젝트속성 - 구성속성 - C/C++ - 코드 생성 - 런타임 라이브러리 - 다중스레드 디버그 DLL(/MDd)로 설정
■ 스레드 생성하기
⠂스레드 생성 및 종료 함수
- 스레드 생성하기
uintptr_t _beginthreadex( //스레드 핸들 값 반환
void* *Security, //SECURITY_ATTRIBUTES 구조체의 포인터 변수, NULL사용
unsigned _StackSize, //스레드를 위한 스택의 크기, 0사용
unsgined (*start_address)(void *), //스레드로 실행할 함수 이름(형변환필요!)
void* *ArgList, //스레드 함수에 전달될 매개변수 주소
unsigned InitFlag, //스레드 상태 지정 값으로 실행하기 위해 0사용
unsigned* *thrdAddr //스레드 ID를 받기 위한 32비트 포인터변수, NULL사용
);
- 스레드 종료하기
void _endthreadex(
unsigned retval //반환을 원하는 값
);
- 스레드 정리하기
BOOL WINAPI CloseHandle(
HANDLE hObject
);
■ 스레드 동기화하기
⠂이벤트 : 스레드간의 동기를 맞추는 데 사용되는 동기화 개체
⠂이벤트 관련 함수
- 이벤트 생성하기
CreateEvent( //이벤트 핸들 값 반환
LPSECURITY_ATTRIBUTES lpEventAttributes, //보안 속성, 보통 NULL사용
BOOL bManualReset, //시그널/넌시그널 수동 변환 설정
//TRUE : SetEvent,ResetEvent로 이벤트
값 수동변환 잘 해야함
//FALSE : WaitForSingleObject함수가
이벤트 변환을 자동으로 수행
BOOL bInitialState, //초기상태
//TRUE:시그널 상태로 이벤트 생성
//FALSE:넌시그널 상태로 이벤트 생성
LPCWSTR lpName); //이벤트 이름, 보통NULL사용
- 이벤트 설정하기
SetEvent( //이벤트를 시그널 상태로 변환
HANDLE hEvent); //이벤트 핸들
- 이벤트 재설정(리셋)하기
BOOL ResetEvent( //이벤트를 넌시그널 상태로 변환
HANDLE hEvent); //이벤트 핸들
- 단일 개체 대기하기
DWORD WaitForSingleObject(
HANDLE hHandle, //대기할 개체의 핸들
DWORD dwMilliseconds); //대기 시간, INFINITE는 무한정 대기
-> hHandle의 시그널상태이면 진행, 넌시그널상태이면 dwMilliseconds동안 대기, 여러개 스레드가 동시에 대기 중이면 이 중 하나만 대기에서 풀리고 나머지는 계속 대기
- 복수 개체 대기하기
DWORD WaitForMultipleObjects(
DWORD nCount, //대기할 개체의 개수
const HANDLE *lpHandles, //기다릴 개체들의 핸들
BOOL bWaitAll, //대기할 개체가 모두 기다려야 하는지 여부
//TRUE : 모든 개체가 시그널 상태가 되기를 대기 //FALSE : 1개의 개체라도 시그널 상태가 되기를 대기
DWORD dwMilliseconds); //대기 시간
-> lpHandles개체가 모두 시그널상태인지 검사.
넌시그널상태이면 bWaitAll의 값에 따라 대기