메뉴 건너뛰기

OBG

Programming

API/MFC
2011.09.26 10:38

CreateThread와 AfxBeginThread의 차이

조회 수 1586 추천 수 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 1708
75 API/MFC Visual C++ 시리얼 통신(RS-232) 강좌 (1) MoA 2013.07.28 6709
74 API/MFC Sleep() 함수 대신 프로그램 딜레이 시키기 (Wait) MoA 2013.07.28 4710
73 API/MFC Visual C++ 시리얼 통신(RS-232) 강좌 (2) 1 MoA 2013.07.28 4456
72 API/MFC MFC 리본 사용하기 (아이콘 제작 포함) 너울 2012.02.09 4345
71 API/MFC 프린터 출력하기 MoA 2013.10.16 3430
70 API/MFC DLL 생성 시 주의 MoA 2013.08.22 2684
69 API/MFC Thread와 SendMessage를 통해 DeadLock을 만드는 방법 MoA 2013.07.28 2625
68 API/MFC 다국어를 위한 StringTable, LoadString 1 MoA 2013.12.22 2408
67 API/MFC 프로세스 - 생성과 종료 그리고 이것 저것 너울 2011.10.12 1834
66 API/MFC 다른 스레드에서 메인다이얼로그 포인터 받아오기 AfxGetMainWnd() 1 MoA 2013.07.28 1613
» API/MFC CreateThread와 AfxBeginThread의 차이 너울 2011.09.26 1586
64 API/MFC MFC 클래스 멤버함수 설명서 MoA 2013.07.28 1513
63 API/MFC unsigned char <-> 유니코드(unicode) 및, string 변환 매크로 - USES_CONVERSION MoA 2013.07.28 1331
62 API/MFC MFC기반의 CSocket 사용 방법과 예제 MoA 2013.07.28 1265
61 API/MFC CFile을 이용한 저장/불러오기 MoA 2013.08.27 1248
60 API/MFC CDockablePane 버튼 비활성화 문제 MoA 2013.07.17 1217
59 API/MFC 리스트 컨트롤에 체크박스 추가 MoA 2013.08.14 1194
58 API/MFC MFC 클래스간 통신 Naya 2012.08.02 1189
57 API/MFC Thread에서 Dialog의 UpdateData()사용하는 방법 너울 2011.09.26 1123
56 API/MFC CPaneDialog 초기화 (OnInitDialog) MoA 2013.07.18 1080
Board Pagination Prev 1 2 3 ... 4 Next
/ 4
위로