[제프리 리처의 Windows via C/C++] 6~9장

2012/02/12 16:09 from 도서리뷰/세미나후기

원래는 스터디 진도에 따라 정리하려고 했는데 많이 늦어지고 있다 ㅜㅠ…

 

6. 스레드의 기본

4장 프로세스와 마찬가지로 스레드의 기본적인 설명들이 자세히 들어있다.

스레드의 생성 : 새로운 스레드를 생성할 수 있는 함수는 윈도우가 제공하는 CreateThread, CRT가 제공하는 _beginthread와 _beginthreadex 이렇게 세가지의 선택이 있다. CreateThread를 바로 호출하면 CRT에서 사용하는 코드의 초기화 처리가 되지 않기 때문에 _beginthreadex를 써야 한다(226p). 그리고 이전 버전의 함수인 _beginthread는 절대 사용하지 말라고 되어 있는데, 이유는

  1. 보안 특성 설정 불가,
  2. suspend상태로 생성 불가능,
  3. 스레드ID획득 불가,
  4. _endthread는 종료코드를 항상 0만 반환,
  5. _endthread가 자체적으로 스레드 핸들을 닫기 때문에 스레드 커널 오브젝트에 접근 불가능 상황 발생

…정도가 있다(236p). 앞에 세 가지 이유는 절대 쓰지 말아야 할 정도까지는 아닌데, 뒤에 두 가지 이유는 치명적일 수 있다. 몰랐던 사실 +_+)

스레드의 종료 : 종료에 관련된 함수가 2개 존재. ExitThread와 TerminateThread인데, ExitThread는 함수를 호출한 스레드 자신을 종료하는 것이고, TerminateThread는 다른 스레드를 종료할 수 있는 함수다. 둘 다 사용하는 것은 좋지 않다. 매우 다양한 이유가 있다. 상식적으로 생각해도 진행중이던 스레드를 갑자기 닫아 버리는 처리는 좋아보이지 않지만, ExitThread로 종료된 스레드는 C/C++ 리소스가 정리되지 않고(218p), TerminateThread로 종료된 스레드는 스레드 스택도 정리되지 않는다(219p). 스레드 함수가 자연적으로 반환되도록 종료시키는 것이 가장 좋다. 만약 스레드 함수가 안정적으로 반환되었더라도 CreateThread에서 받은 핸들을 닫아주지 않았다면 스레드 커널 오브젝트는 파괴되지 않고 남아있다(220p).

Section 6 스레드의 내부, Section 7 CRT 라이브러리의 고찰 부분에서는 스레드의 바닥 부분에 대한 설명이 나와있다. 쉽게 말해,

스레드 콜스택의 가장 아래 RtlUserThreadStart 함수부터, _beginthreadex 함수 내부의 코드들까지.. 스레드의 시작과 종료에 대한 내부 처리들을 설명해준다. 여태껏 윈도우 프로그램 짜면서 한 번도 궁금해 본 적도 없고 들여다 본 적도 없는 부분이었는데 설명을 읽으며 아주 재미있었다.

허위핸들 pseudohandle

핸들 중에는 실제 유효한 값을 갖는 핸들 말고 허위 핸들이라는 개념이 있다. 이런 핸들의 경우 다른 스레드나 프로세스로 전달해 공유할 때 문제가 생길 수 있는데, GetCurrentProcess(), GetCurrentThread() 함수로 얻는 핸들은 허위핸들이다. 고유한 커널 오브젝트를 가리키는 것이 아니어서, 허위 스레드핸들을 다른 스레드로 넘길 경우, 이 핸들을 자신을 사용하여 함수를 호출하는 스레드를 가리키게 된다. 허위 핸들을 실제 핸들로 변환하고자 하는 경우에는 3장에서 소개됐던 DuplicateHandle 함수를 이용해 핸들을 복사하면 된다.

 

 

 

====================================

 

[출처] http://devnote.tistory.com/224

걍 그대로 긁어옴

 

2014/01/17 - [프로그래밍 언어/C++] - [Windows] 쓰레드(Thread) 생성 예제