로그인

검색

API/MFC
2011.09.26 10:38

CreateThread와 AfxBeginThread의 차이

조회 수 2457 추천 수 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 5312
288 LLM Comparing Replit and Cursor for AI-Powered Coding OBG 2024.09.21 444
287 Tool/etc Synology: Top Best Apps For Docker OBG 2024.07.01 360
286 Graphic ASCII 3D 렌더러 만들기 OBG 2024.06.03 377
285 LLM Anthropic, LLM의 내부를 이해하는데 있어 상당한 진전을 보임 OBG 2024.06.03 334
284 LLM llama3 implemented from scratch OBG 2024.05.24 305
283 Tool/etc HuggingFace 공동창업자가 추천하는 AI 분야 입문 서적 OBG 2024.05.24 373
282 LLM [VESSL AI] 뉴욕주민의 프로젝트플루토 — LLM, LLMOps를 활용한 금융 미디어의 혁신 OBG 2024.04.21 706
281 LLM PEFT: Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware OBG 2024.04.15 286
280 LLM The difference between quantization methods for the same bits OBG 2024.04.14 334
279 LLM Mixture of Experts - Part 2 OBG 2024.04.14 331
278 LLM ChatGPT의 강력한 경쟁 언어모델 등장!, Mixtral 8x7B OBG 2024.04.14 503
277 LLM Real-Time Stock News Sentiment Prediction with Python OBG 2024.04.11 583
276 LLM Getting Started with Sentiment Analysis using Python OBG 2024.04.11 350
275 LLM How LLMs Work ? Explained in 9 Steps — Transformer Architecture OBG 2024.04.11 351
274 LLM 만능 프롬프트 OBG 2024.04.07 723
273 LLM A Beginner's Guide to Prompt Engineering with GitHub Copilot OBG 2024.04.04 338
272 LLM [12월 1주] 떠오르는 '미스트랄 7B'...'라마 2' 이어 한국어 모델 세대교체 주도 OBG 2024.03.05 472
271 Deeplearning Using Machine Learning to Predict Customers’ Next Purchase Day OBG 2024.02.27 335
270 서버 멀티-플레이어 게임 서버와 레이턴시 보상 테크닉 OBG 2024.01.16 440
269 Deeplearning [ifkakao] 추천 시스템: 맥락과 취향 사이 줄타 OBG 2024.01.10 376
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 15 Next
/ 15