1. C/C++프로그래밍과 ::CreateThread


윈도우가 제공하는 CreateThread함수는 스레드를 생성하는 함수입니다. 하지만 C/C++로 코드를 작성하는 경우에는 CreateThread를 사용해서는 안 되고, 마이크로소프트 C/C++ runtime-library에서 제공하는 _beginthreadex함수를 사용해야 합니다. 다른 컴파일러에서도 ::CreateThread함수를 대체할 만한 함수를 제공할 것이며, 반드시 컴파일러에 의해 제공되는 다른 함수를 사용해야 합니다.



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++ 라이브러리는 제공하지 않습니다.



4. _beginthread와 _endthread


_beginthread함수는 새로운 스레드를 생성하고 난 후 바로 ::CloseHandle 함수를 호출하여 새로 생성된 스레드의 핸들을 제거하게 됩니다. 따라서 _beginthread함수 호출 이후에 이 스레드 핸들에 접근 할 수 없게 됩니다. _beginthread함수의 이런 동작은 Win32의 상세함을 숨기기 위해 고안되었으나 결국 버그가 되어버린 함수입니다. 따라서 마이크로소프트는 이러한 버그를 수정한 _beginthreadex함수를 만들게 되었습니다.

_beginthread함수는 ::CreateThread, _begintheadex함수에 비해 매개변수의 개수가 적습니다. 보안특성을 가진 스레드를 생성할 수 없으며, 일시 정지된 상태의 스레드도 생성할 수 없고, 스레드의 ID 값을 얻을 수도 없습니다. _beginthread함수는 스레드가 종료되면 자동으로 _endthread함수를 호출 하는데 이 함수는 어떠한 매개변수도 가지고 있지 않기 때문에 스레드의 종료 코드는 항상 0 입니다.



5. _beginthreadex와 _endthreadex


::CreateThread 함수의 문제점을 보완하기 위해 C/C++ runtime-library가 제공하는 스레드를 생성하는 함수로서 각 스레드 별로 적절한 구조의 데이터 블록을 생성합니다. ::CreateThread함수와 동일한 매개변수를 가지고 있지만 매개변수의 이름과 형태가 일치 하지 않습니다. C/C++ run-time library가 윈도우의 자료형에 의존성을 가지지 않도록 개발했기 때문입니다.

_beginthreadex함수의 반환값은 ::CreateThread함수의 반환값과 같은 새로 생성된 스레드의 핸들 값입니다. 하지만 자료형이 정확하게 일치하지는 않기 때문에 적절하게 형변환을 해줘야 합니다. _beginthreadex함수는 _beginthread함수와는 달리 내부적으로 새로 생성한 스레드의 핸들을 제거하지 않기 때문에 명시적으로 ::CloseHandle 함수를 호출해 주어야 합니다. _beginthreadex함수에 의해 생성된 스레드가 종료되면 _endthreadex함수가 자동으로 호출됩니다.



6. ::AfxBeginThread


MFC 에서 스레드(Worker thread, User interface thread)를 생성하는 함수입니다. ::AfxBeginThread함수는 실제 스레드 생성을 수행하지 않습니다. 스레드 생성을 위한 객체를 생성하고 스레드 생성을 위해 CWinThread::CreateThread함수를 호출하는 것이 전부입니다. 실제 스레드 생성은 CWinThread::CreateThread 함수 내부에 구현되어 있습니다. 내부적으로 _beginthreadex함수를 호출하여 스레드를 생성합니다.