• CreateThread & _beginthreadex

    2014. 11. 2.

    by. xxx123

     

     

    CreateThread() 함수는 사용하지 말고 _beginthreadex()함수를 사용하라고하는데 CreateThread() 함수에는 어떤문제가 있는 것인가.

     

     

     

    1. CreateThread()

    CreateThread() 함수는 CRT 함수가 아닌 WinAPI 함수이다. 또한 이 함수는 멀티스레드가 고려되지 않은 시기에 만들어졌다.

    그러므로 당연히 멀티스레드를 사용하는 상황에서 문제가 발생할 수 있다.

    예를 들어 strtok() 함수 같은 경우 내부적으로 static 변수를 선언하고 사용하는데, 멀티스레드 환경에서 이러한 전역 변수를 동기화없이 공유하여 사용하게 된다면 문제가 될 수 있다. (물론, 멀티스레드가 고려된 strtok 함수는 내부가 좀 다를것이다.)

     

     

     

     

     

    2. _beginthreadex()

    그래서 나온것이 _beginthreadex() 함수이다. 

    _beginthreadex() 함수도 내부적으로 CreateThread() 함수를 호출하지만 그에 앞서서 멀티스레드에서 활용될 독립적인 메모리 블록(_tiddata)을 CRT 힙에 할당한다.

     

     

     

     

    할당한 이 메모리 블럭의 주소는 각 스레드의  TLS에 저장하여 연계시키며, 이는 각종 C/C++ 런타임 라이브러리 함수들의 멀티스레드 문제를 해결하는데 사용된다.

     

    즉, Multi-Threaded 런타임 라이브러리 함수 호출 시 해당 스레드의 tiddata 메모리 블록을 찾아보게 될때 사용되는 것이다.

     

     

     

     

     

    사실! CreateThread() 함수를 사용한다고 해서 tiddata 블록이 생성되지 않는 것은 아니다.

    멀티스레드용 CRT 함수를 호출 시에 해당 스레드의 tiddata블록이 null 이라면 내부적으로 tiddata 블록을 할당하여 사용 하기 때문이다.

     

    하지만, 문제는 CreateThread() 함수를 사용한 사용자가 _endthreadex() 함수를 호출하여 메모리 블럭을 해제하지 않을 것이기 때문에 문제가 발생하는 것이다. (분명 ExitThread() 함수로 종료 시킬것이다.

     

    결국 현재 상황에서는 CreateThread() 함수의 호출은 메모리 누수와 관련이 있다고 볼 수 있는 것이다.

     

     

     

    'Programming > C/C++' 카테고리의 다른 글

    Virtual Table (가상함수 테이블)  (0) 2014.12.18
    inline  (0) 2014.12.17
    new operator, operator new, placement new  (0) 2014.07.18
    shared_ptr  (0) 2014.06.20
    템플릿 템플릿 인자  (0) 2013.09.27

    댓글