윈도우에서 스레드를 사용하는 방법에 대해 알아보자.
예제 소스는 총 3가지로 점차 완성도가 높아지도록 구성되어있다.
# 스레드에 대해 고려 할 사항은 다음과 같다.
1. 스레드는 생성되면, 부모 프로세스의 자원을 공유한다.
-> 부모프로세스의 중요자원은 건드리지 않도록 한다.
2. 부모프로세스가 자식 스레드를 생성하는데, 자식스레드보다 부모프로세스가 먼저 죽는 경우가 생긴다.
-> 부모프로세스는 자식스레드가 죽을때까지 기다리도록 한다.
# 윈도우즈기반에서 스레드를 사용하는데 필요한 개념에 대해 알아보자.
1. 스레드 변수 타입 HANDLE
스레드 변수는 윈도우즈 기반에서 HANDLE변수를 사용한다.
C/C++에서는 int, double등의 예약된 타입이 있다. 하지만 이러한 타입외에 특정한 형식을 보기쉽게 재정의 해놓은것이 HANDLE타입이다. 즉 HANDLE 타입의 실체는 void* 다. 단지 void*를 보기좋게 재정의 해 놓은 것이다.
2. DWORD 타입
이 타입 역시 HANDLE과 마찬가지로 특정한 형식을 보기쉽게 재정의 해 놓은것이다.
WORD라는 것은 데이터 처리 단위인데, DWORD는 double word로 WORD의 2배이다.
C/C++에서 DWORD의 실체는 ungsigned long 형식이다.
3. _beginthreadex 스레드 생성함수
위 함수는 pthread.h 에 있는 함수로, 스레드를 생성할 수 있다.
hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, NULL, 0, (unsigned *)&dwThreadID);
4. wait 함수
이 함수는 유닉스 시스템에서의 wait함수와 같다. 커널 오브젝트 상태확인 함수이다. 스레드의 상태를 리턴해준다.
WaitForSingleObject(hThread1, INFINITE) == WAIT_FAILED
<thread1_win.c>
해당 소스는 스레드를 1개 생성하는데 프로세스가 자식스레드보다 먼저 죽는 경우다.
<thread2_win.c>
해당 소스는 thread1_win.c 의 문제점인 프로세스가 자식스레드보다 먼저 죽는것에 대한 해결 방안이다.
하지만 아직 다중스레드는 구현되지 않았다.
<thread3_win.c>
해당 소스는 다중스레드로 구현되어있다.
예제 소스는 총 3가지로 점차 완성도가 높아지도록 구성되어있다.
# 스레드에 대해 고려 할 사항은 다음과 같다.
1. 스레드는 생성되면, 부모 프로세스의 자원을 공유한다.
-> 부모프로세스의 중요자원은 건드리지 않도록 한다.
2. 부모프로세스가 자식 스레드를 생성하는데, 자식스레드보다 부모프로세스가 먼저 죽는 경우가 생긴다.
-> 부모프로세스는 자식스레드가 죽을때까지 기다리도록 한다.
# 윈도우즈기반에서 스레드를 사용하는데 필요한 개념에 대해 알아보자.
1. 스레드 변수 타입 HANDLE
스레드 변수는 윈도우즈 기반에서 HANDLE변수를 사용한다.
C/C++에서는 int, double등의 예약된 타입이 있다. 하지만 이러한 타입외에 특정한 형식을 보기쉽게 재정의 해놓은것이 HANDLE타입이다. 즉 HANDLE 타입의 실체는 void* 다. 단지 void*를 보기좋게 재정의 해 놓은 것이다.
2. DWORD 타입
이 타입 역시 HANDLE과 마찬가지로 특정한 형식을 보기쉽게 재정의 해 놓은것이다.
WORD라는 것은 데이터 처리 단위인데, DWORD는 double word로 WORD의 2배이다.
C/C++에서 DWORD의 실체는 ungsigned long 형식이다.
3. _beginthreadex 스레드 생성함수
hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, NULL, 0, (unsigned *)&dwThreadID);
4. wait 함수
WaitForSingleObject(hThread1, INFINITE) == WAIT_FAILED
<thread1_win.c>
해당 소스는 스레드를 1개 생성하는데 프로세스가 자식스레드보다 먼저 죽는 경우다.
해당 소스는 thread1_win.c 의 문제점인 프로세스가 자식스레드보다 먼저 죽는것에 대한 해결 방안이다.
하지만 아직 다중스레드는 구현되지 않았다.
해당 소스는 다중스레드로 구현되어있다.
'기타 > C++' 카테고리의 다른 글
C++ 런타임 라이브러리 (0) | 2010.11.17 |
---|---|
C++ 코드 -> 컴파일 -> 링커 -> 실행파일 까지의 과정 (0) | 2010.11.16 |
헤더파일의 전역변수 사용하기 (0) | 2010.11.16 |
#pragma의 사용, 헤더파일 중복 막는 방법 (0) | 2010.11.16 |