1. VC++ 에서 스레드 생성

   
 

VC++ 에서 스레드를 생성하는 방법은  5가지 방식이 있다.

 

1. WIN32 API 스레드 생성 함수  : CreateThread

 

2. C run time library 에서의 스레드 생성 함수 : _beginthreadex, _beginthread

- _beginthreadex 가 _beginthread보다 많이 사용됨.

- _beginthreadex 와 _beginthread 함수 내부에서는 상기1의 CreateThread 함수가 사용되고 있음.

 

3. C++ 클래스 형식의 스레드 생성 : 스레드  함수를 포함하는 클래스 형식으로 제작.

- 상기 2의 함수를 C++에서 클래스 내에 포함시키는 형식으로 만드는 것을 의미한다. 결국 2를 클래스에서 사용하는 것을 의미함.

- 스레드로 사용할 클래스 멤버함수는 static 으로 선언해서 사용해야한다.

- 스레드를 소유하는 클래스에서 스레드 함수인자로 this 포인터를 전달하면 스레드 함수내에서 클래스멤버함수.변수 에 접근할 수 있기 때문에 편하다.

 

4. MFC에서 제공하는 스레드클래스 CWinThread 생성 함수  : AfxBeginThread 

- AfxBeginThread 는 MFC에서 제공되는 스레드 클래스인 CWinThread 개체를 생성하는 전역함수이다. worker thread(작업자 스레드), user interface thread(사용자 인터페이스 스레드) 를 생성할 수 있다.

- AfxBeginThread 함수 내부적으로는 상기 2의 _beginthreadex 를 이용하고있다.

- CWinThread 는 메시지 루프가 제공된다는 점이 주요특징이다. 이를 이용하여 사용자 입력또는 이벤트를 처리할 수 있다.

- AfxBeginThread 로 생성된 스레드를 스레드 외부에서 강제로 종료할 수 있는 MFC전역함수는 제공되지 않는다. WIN32 함수인 TerminateThread 함수를 사용하여 스레드 외부에서 강제 종료 가능하다.



5.C++11 std::thread 클래스 이용한 스레드 생성.

- 헤더 : <thread>

- VC++에서 std::thread 로 스레드 생성할때 내부적으로는 _beginthreadex 가 호출됨.

- 사용법 상세 : http://igotit.tistory.com/559


 

 

 

 

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

 

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

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


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

 

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



 


 


 본 글이 포함된 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 


///211.

Posted by 리치굿맨

댓글을 달아 주세요