오다기리 박의 알고리즘 노트

[WIN32 API] 10. 멀티스레드 본문

WIN32 API

[WIN32 API] 10. 멀티스레드

오다기리 박 2018. 1. 24. 11:09

10. 멀티스레드



⠂스레드 : 컴퓨터가 연속된 명령어를 차례로 하나씩 처리하는데, 이렇게 처리되는 명령어의 흐름. 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드라고 한다.


⠂프로젝트 설정

  1. C런타임 라이브러리 process.h 파일 포함 -> _beginthreadex() 함수를 이용하여 Win32 API환경에서 멀티스레드 프로그램 작성을 위해

  2. 프로젝트 환경에 멀티스레드 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의 값에 따라 대기