본문 바로가기

Programming/API

스레드 생성 함수

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