일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 컴퓨터 아키텍쳐
- Graphics
- bezier curve
- 윈도우 프로그래밍
- 베지에 곡선
- 렌더링
- 셰이더
- MFC
- 운영체제
- 윈도우
- 그래픽스기초
- window programming
- 윈도우 구조
- c4d
- 컴퓨터 구조
- shader programming
- Mesh Processing
- 윈도우프로그래밍
- 핵심 API로 배우는 윈도우프로그래밍
- modeling
- 그래픽스
- win32
- shader
- Geometry Modeling
- Win32 API
- OpenGL
- 오픈지엘
- denoising
- MFC 윈도우 프로그래밍
- 셰이더프로그래밍
- Today
- Total
오다기리 박의 알고리즘 노트
[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의 값에 따라 대기
'WIN32 API' 카테고리의 다른 글
[핵심 API로 배우는 윈도우프로그래밍(강경우, 한빛아카데미)] 10장 2번 풀이 (0) | 2018.01.24 |
---|---|
[핵심 API로 배우는 윈도우프로그래밍(강경우, 한빛아카데미)] 10장 1번 풀이 (0) | 2018.01.24 |
[핵심 API로 배우는 윈도우프로그래밍(강경우, 한빛아카데미)] 9장 9번 풀이(미완성) (0) | 2018.01.09 |
[핵심 API로 배우는 윈도우프로그래밍(강경우, 한빛아카데미)] 9장 8번 풀이 (0) | 2018.01.09 |
[핵심 API로 배우는 윈도우프로그래밍(강경우, 한빛아카데미)] 9장 5번 풀이 (0) | 2018.01.09 |