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() 함수의 호출은 메모리 누수와 관련이 있다고 볼 수 있는 것이다.





http://chfhrqnfrhc.tistory.com/entry/CreateThread-beginthreadex



다중스레드 사용하기 위한 필수 셋팅

 

 VC++ 로 만든 실행프로그램내에서 스레드를 1개만 사용하는 것이 아닌 경우 VC++ 프로젝트 속성 설정창에서 반드시 다중스레드를 지원하는 C run time library 를 사용하는 것으로 설정이 되어 있어야 한다. 

아래 그림처럼 프로젝트 속성창에서  "다중 스레드 DLL (/MD)" 를 선택해야한다. 프로젝트를 디버그 모드에서 개발중이라면  "다중 스레드 디버그 DLL (/MDd)" 를 선택하면된다.


이름에 DLL 이 붙어있는것은 C런타임 라이브러리를 동적으로 링크하는 설정이고, 이름에 DLL 이 붙어있지 않은 것은 정적으로 링크 한다는 의미이고, 이름에 dll이 붙어있는것은 동적으로 링크 한다는 설정인데, 이 설정은 프로젝트의 "속성  -> 일반 -> MFC 사용" 을 "정적 라이브러리에서 MFC사용" 으로 한 경우에는 런타임 라이브러리는  "다중스레드 (/MT)" 를 선택해야하고, "MFC사용" 선택을 동적  MFC사용으로 한경우에는 본 런타임 라이브러리에서는 "다중 스레드 DLL (/MD)" 를 선택해야한다. 이것 짝이 맞지 않은 경우에는 컴파일시에 에러가 나오므로 실수할 걱정은 하지 않아도 된다.

 

만일 아래 옵션이 단일스레드로 설정된 상태에서 _beginthreadex 나 _beginthread 를 사용하면 컴파일시 에러가 발생한다.






 http://igotit.tistory.com/entry/스레드-생성-방법-및-다중스레드-사용위한-필수-옵션-셋팅-VC [igotit]






2. 멀티 스레드 안전한 C/C++ Library
  역사적으로 C runtime-library 개발자는 멀티 스레드 어플리케이션에서 C runtime-library 를
사용하였을 때 발생하는 문제에 대해서는 전혀 고려하지 않았다. 멀티 스레드 어플리케이션
에서 전통적인 C runtime-library 를 사용하였을 때 문제가 발생할 수 있다.
따라서 Microsoft 는 이러한  문제를 해결하기 위해서 스레드 안전한 C/C++ runtime-library 를
제공하고 있다.
멀티 스레드 안전한 C/C++ run-time library 함수는 다른 스레들로부터 영향을 받지 않도록
자신을 호출한 스레드의 데이터 블록에만 접근 가능하게 한다.


3. Single-thread C/C++Library 와 Multi-thread C/C++ Library
Single-thread C/C++Library 는 단일 스레드 전용의 함수들을 말하고,
Multi-thread C/C++ Library 는 멀티 스레드 전용의 함수들을 말한다.

   ※ Visual Studio 2008 에서는 Multi-thread C/C++ Library 만 지원한다. 
       즉 더 이상 단일 스레드 전용의 C/C++ 라이브러리는 제공하지 않는다.



http://egloos.zum.com/heilow/v/83533

반응형

+ Recent posts