본문 바로가기

대학원 수업관련

CreateThread, _beginthread, _beginthreadex의 차이

CreateThread

1. CreateThread는 c/c++ Runtime Library에서 제공하는 함수가 아닌, WinApi 전용함수이다. 때문에 return값이 

HANDLE 타입으로 반환된다. 


2. Thread를 사용할일이 있을때 CreateThread함수를 쓰면 안된다. 왜냐하면, CreateThread를 이용하여 생성한 스레드 구문 내부에 c/c++ 런타임 함수를 사용할경우, c/c++함수는 실행되지 않고 스레드만 죽어버리기 때문이다.

예를들어 strtok함수의 경우 내부적으로 처음 호출때 받은 포인터를 내부적으로 정적변수로 저장하고 이후 호출에서 사용한다. 

이럴 경우 다른 쓰레드에서 이 함수를 호출하게 되면 처음 호출때 받은 내부 정적 변수를 덮어 써 버리게 된다. 

이런 문제를 피하기 위해서 윈도우즈에서는 TLS(Thread Local Storage)를 제공한다.


3. 왠만하면 쓰레드 생성시에 CreateThread는 안쓰는게 좋다


_beginthread

 내부적으로는 CreateThread()사용하여 쓰레드를 생성하지만, C Runtime Library 내부적으로 필요로 하는 메모리 영역을 초기화 해주는 역할도 한다. 초기화 되는 메모리 영역은 각 쓰레드 마다 따로 관리된다.

_beginthread : 

1. 보안특성을 가진 쓰레드를 생성할수 없다.


2. 일시 정지된 상태의 쓰레드도 생성할수 없다.


3. 스레드 종료시에 CloseHandle()이 내부적으로 호출되므로, 쓰레드 함수 완료후 쓰레드의 ID값도 얻을수 없기 때문에 쓰레드 종료후에

쓰레드 오브젝트와 통신할수 없다


_beginthreadex

1. 내부적으로 메모리 블럭을 할당한다.

2. 예외처리 프레임을 구성하고 signal함수가 정상동작하도록 작업을 수행한다.

3. 쓰레드가 실행완료된후 내부적으로 CloseHandle()을 호출하지 않기 때문에 사용자가 명시적으로 CloseHandle()을 호출해주어야 한다.

4. 내부적으로 _exitThreadex()함수를 호출하여 메모리 정리까지 해준다.(멀티 쓰레드 환경에 적합하다)

5. 또한 return값이 unsigned int형이므로 (HANDLE)형으로 캐스팅해주면 Win32에서 지원하는 Thread관련 함수들도 사용할수 있다.


'대학원 수업관련' 카테고리의 다른 글

Thread를 이용한 Matrix Multiply  (0) 2014.04.03
Thread 함수 참고  (0) 2014.03.31
Thread 발표 참고 링크  (0) 2014.03.28
Thread 사용법, CreateThread() / _BeginThreadex()  (0) 2014.03.27
Thread 관련 링크  (0) 2014.03.26