상세 컨텐츠

본문 제목

12.1 Windows에서의 쓰레드 생성과 소멸

Programming/Windows System

by RACC8N 2020. 4. 19. 15:18

본문

쓰레드의 생성

 

쓰레드 생성 함수 : CreateThread()

lpThreadAttributes 보안 속성 지정 (핸들 상속 여부) 
dwStackSize 쓰레드의 스택 크기 지정 ( 0 : default )
lpStartAddress

쓰레드로 동작하기 위한 함수 (쓰레드의 Main 역할을 하는 함수)

반환 타입 : DWORD, 매개변수 타입 : LPVOID(void*)

lpParameter 쓰레드 함수에 전달할 인자 지정 (main 함수의 argv와 유사)
dwCreationFlags

쓰레드의 생성 및 실행을 조절

(CREATE_SUSPENDED : 쓰레드 생성과 동시에 blocked상태)

lpThreadId 쓰레드 ID를 전달받기 위한 변수의 주소값을 전달 (필요 없으면 NULL)

쓰레드 흐름도

- main 쓰레드는 프로세스 전체를 대표한다. 따라서 main 쓰레드의 return문은 프로세스 종료로 이어진다.

- 쓰레드의 흐름을 예측한다는 것은 불가능하다. (어떤게 먼저 시작할지, 언제 시작할지 알 수 없다.)

 

쓰레드의 소멸

 

1. return 사용 (거의 대부분의 경우)

[EXAMPLE] 3개의 쓰레드를 생성해서 1부터 10까지의 덧셈연산을 나눠서 시킨다. A의 return값, B의 return값, C의 return 값을 얻어 main 쓰레드에서 합치면 효율이 더 좋다.

 

Thread의 종료 코드를 얻는 함수 : GetExitCodeThread()

hThread 종료코드를 얻기 위한 쓰레드의 핸들
lpExitCode 얻게 되는 종료코드를 저장할 메모리의 주소값 전달

2. ExitThread 사용 (특정 위치에서 쓰레드의 시행을 종료시킴)

dwExitCode 커널 오브젝트에 등록되는 쓰레드 종료코드를 지정

- 언제 어디서나 쓰레드를 종료시킬 수 있다. 

 

return과 ExitThread의 비교

thread function이 함수 A를 함수 A가 함수 B를, 함수 B가 함수 C를 호출하는 상황이다.

return은 thread function까지 다시 와야만 종료가 가능해지고,

ExitThread는 함수 A, 함수 B, 함수 C 어디서든 thread function을 종료시킬 수 있다.

 

3. TerminateThread 사용 (외부에서 쓰레드를 종료시킴)

hThread 강제 종료할 쓰레드의 핸들
dwExitCode 커널 오브젝트에 등록되는 쓰레드 종료코드를 지정

- main 함수 내에서 쓰레드를 생성할 경우 해당 쓰레드의 핸들을 얻게 되는데 이 핸들을 이용해서 쓰레드를 강제 종료 시킬 수 있다. 

 

관련글 더보기

댓글 영역