API에서 사용되어지는 스레드를 생성하는 함수는
1. CreateThread()
2. _beginthread()
3. _beginthreadex()
3가지이다.
CreateThread()
WinAPI 전용 함수로 return값으로 HANDLE 타입을 반환한다. 순수하게 스레드를 생성하는 기능만 담당한다.
CreateThread함수가 WinAPI 전용 함수이기에 c,c++런타임 라이브러리 함수를 이용할 경우에 c,c++함수는 실행하지 않고 스레드가 죽어버린다.
WinAPI함수만 호출 할 때에는 상관이 없지만 c,c++ 같은 형태의 함수를 사용할 수 없기에 스레드 생성시 CreateThread()함수를 권장하지 않는다고 한다.
종료시는 먼저 CloseHandle()을 이용해 핸들을 닫고 ExitThread()를 통해 종료를 시켜준다.
_beginthread(), _beginthreadex()
이 두 함수는 c,c++런타임 라이브러리에서 제공되는 함수이기 때문에 CreateThread()함수와 다르게 c,c++런타임 라이브러리 함수와, WinAPI 함수 모두 사용 가능하다.
각각 _endthread(), _endthreadex()로 스레드를 종료하며 자동으로 호출된다.
_beginthread 함수의 경우 보안 특성이 설정이 불가능 하고 _endthread가 종료할 때 항상 0을 리턴하는 점 등의 문제들이 있지만 가장 큰 문제는 새로운 스레드를 생성하고 난 후 바로 CloseHandle()함수를 호출해서 생성한 쓰레드의 핸들을 닫아 생성한 쓰레드 오브젝트와 통신을 할 수 없게 되버려 사용하지 않는다.
_beginthreadex 함수는 _beginthread 함수의 잘못된 점들이 수정되어진 함수로 security를 이용하여 보안 관련 설정을 할 수 있으며, CloseHandle()함수를 호출하지 않기 때문에 스레드 핸들을 이용한 API 함수를 실행 할 수 있다. 자동으로 호출하지 않기 때문에 사용자가 CloseHandle()함수를 호출해 주어야하고 그렇지 않으면 리소스 누수가 생긴다.
리턴값은 새로 생성된 쓰레드의 핸들값으로 자료형이 정확히 일치하지 않기 때문에 적절하게 형변환을 해줘야 한다.
'Programming > API' 카테고리의 다른 글
keybd_event() (0) | 2013.11.16 |
---|---|
_beginthreadex함수 (0) | 2013.10.10 |
그리기 모드 (0) | 2013.08.27 |
펜과 브러시 (0) | 2013.08.23 |
GDI 오브젝트 (0) | 2013.08.22 |