메뉴 건너뛰기

OBG

Programming

API/MFC
2011.09.26 10:38

CreateThread와 AfxBeginThread의 차이

조회 수 1591 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

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 함수 내부에 구현되어 있다.
CWinThread::CreateThread 함수는 내부적으로 _beginthreadex 함수를 호출하여 스레드를 
생성한다.


http://six605.tistory.com/277



먼저, _beginthread(ex)() 함수나 AfxBeginThread() 함수는 같은 계열의 함수입니다.

앞의 함수를 내부적으로 wrapping 한 경우가 MFC의 AfxBeginThread()함수입니다.


결정적으로 _beginthread()는 쓰레드를 생성하고 돌리는 과정에서 자체의 메모리 공간을 설정하고 보장을

합니다. 따라서 내부에 static variable이나 static buffer를 사용하는 과정에서 오류가 발생하지 않습니

다.


그러나 CreateThread()계열의 함수들은, 독자적인 메모리 공간을 설정하지 않으므로, 사용하면 memory leak

이 발생합니다. 따라서 사용하지 않는게 좋은 방법이지요.(가급적)



그리고 MSDN의 마지막 부분은 저두 읽을때, 약간 애매했던 부분인데, 머라 딱 꼬집어서 말씀드리기가 그렇

네요...


http://bwangel.egloos.com/923635

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Tool/etc Programming 게시판 관련 2 MoA 2014.11.01 1714
87 Tool/etc 자바스크립트 물리엔진 ㄷㄷ MoA 2014.03.10 614
86 Python SciPy and NumPy MoA 2013.12.23 615
85 C/C++ fwrite(), fread() MoA 2013.07.28 617
84 C/C++ C++에서 base64로 인코딩 Naya 2012.11.15 624
83 API/MFC VC++6.0 에서 VC++ 2005로 변환할 경우 형변환 경고 대응방법 MoA 2013.07.28 626
82 API/MFC 슬라이더 컨트롤에 툴팁 삽입 (동적 툴팁) MoA 2013.10.28 630
81 Python 고양이 밖으로 못나가게 하기 file MoA 2013.11.10 631
80 API/MFC Deploying a Visual C++ Application (배포 방법) Naya 2012.08.02 634
79 JAVA/Android 리스트뷰에 체크박스 추가 예제 MoA 2013.05.24 638
78 Python [농장게임 만들기] 9. 밀을 재배하자 file MoA 2014.05.01 640
77 Python [GUI] Tkinter, wxPython MoA 2013.11.27 644
76 Algorithm 큰 수 구하기 알고리즘 Naya 2012.08.02 658
75 Python [GUI] wxPython 기본 프로그램 file MoA 2013.11.30 660
74 API/MFC MFC에서 생성,사용되는 파일 확장자 MoA 2013.08.30 669
73 Tool/etc Coding conventions MoA 2013.07.28 674
72 Python [액션게임 만들기] 4. 캐릭터 선택 화면 file OBG 2014.05.07 674
71 Python [첫게임 만들기] 4. 화살을 발사해보자 file MoA 2013.11.21 676
70 Python [농장게임 만들기] 8. HUD에 텍스트를 표시하자 file MoA 2014.05.01 677
69 Site 개발자를 위한 각 기업 오픈소스 공유 사이트 (주로 모바일) Naya 2012.08.02 683
68 C/C++ memset vs for 초기화. 속도 차이가 얼마나 날까? 2 MoA 2013.07.28 687
Board Pagination Prev 1 ... 6 7 8 9 10 11 12 13 14 ... 15 Next
/ 15
위로