소프트웨어/Thread

스레드 프로그래밍 연습 - 2 : 스레드 종료

카켈 2007. 5. 2. 09:36
코드 출처
http://www.warpspeed.com.au/cgi-bin/inf2html.cmd?..\html\book\Toolkt40\XPG4REF.INF+101
바로 받기




코드 개요
스레드를 강제 종료하는 내용과 스레드 수행 대기를 담았습니다.

실행 화면

코드 설명
/*
	스레드 프로그래밍 연습 - 2 : 스레드 강제 종료
	thread_end.cpp

	저작권
	http://www.warpspeed.com.au/cgi-bin/inf2html.cmd?..\html\book\Toolkt40\XPG4REF.INF+101 - 출처
	http:/cakel.tistory.com - 번역/수정
	교육용을 목적으로 자유롭게 배포가 가능합니다.

	스레드를 생성한 후 강제 종료하는 방법의 예를 기술한 문서입니다.

*/

#include <stdio.h>
#include <process.h>
#include <windows.h>

/*

+	_endthread() - 최근에 수행을 시작한 스레드가 강제종료 됩니다.
	_beginthread() 와 같이 씁니다. (WIN32용)
	 closethread() 와는 다른 방식으로 생성 되므로 closethread()
	 함수는 createthread() 와 맞춰 쓰시면 됩니다. (MFC용)
	 용도에 따라 다른 쓰레드 함수를 쓰시기 바랍니다.

*/

void hello(void *arg)
{
	int i = 0;
	while (i++ < 5)
	{
		printf("안녕하세요!\n");
		
	}
	_endthread();		// 여기 까지 실행하고 종료 됩니다.
	puts("hello 스레드가 여길 실행하지 못하고 종료 합니다."); 
	return;

}

void nice(void *arg)
{
	int i = 0;
	while (i++ < 5)
	{
		printf("반갑습니다!\n");

	}
	// 스레드가 명시된 곳 까지 수행할수 있습니다.
	puts("nice 스레드가 여기까지 수행하고 종료 합니다.");

	return;
}

int main(void)
{
	// 스레드의 수행 주소를 담은 핸들
	HANDLE thread_1, thread_2;

	// 스레드 활성화(Activation)
	thread_1 = (HANDLE) _beginthread(hello, 0, NULL);
	thread_2 = (HANDLE) _beginthread(nice, 0, NULL);

	// 메인 스레드인 main() 함수가 먼저 return 0 로 도달하면
	
	/* WaitForSingleObject(스레드 주소, 시간)
	 스레드가 다 실행 못하고 끝이 나므로 WaitForSingleObject
	 함수를 써서 해당 스레드가 끝날때 까지 기다려 줍니다.
	 시간이 INFINITE 는 예약어로써 무한대로 기다려준다는 뜻입니다.
	
	*/
	
	
	/* _beginthread 가 long 형으로 수행주소를 리턴 하지만
		WaitForSingleObject 에서 받는 스레드 주소는 void* 로 받기
		때문에 void* 형인 HANDLE 로 스레드 주소를 저장합니다.
		long* 주소를 void* 으로 형 변환합니다.
		void 포인터(void* ) 는 범용으로 주소를 형변환 하면 자유자재로
		받을수 있습니다. 대신 내 보낼때 특정 형식에 맞춰서 보내지 않으면
		얘기치 못한 오류가 생길수 있습니다. */

	WaitForSingleObject(thread_1, INFINITE);
	WaitForSingleObject(thread_2, INFINITE);

	printf("생성된 스레드가 종료 되었습니다.\n");

	return 0;

}