소프트웨어/Thread

스레드 프로그래밍 연습 - 3 : 스레드 동시 수행

카켈 2007. 5. 2. 12:50
코드 주소
http://kin.naver.com/db/detail.php?d1id=1&dir_id=10104&eid=9kk6jmd+YayvujZz7fRRjP8F0n0+o/Yc&qb=vrK3ubXl

코드 받기



수행 화면

코드 설명

병렬로 스레드를 수행할때 지연을 줬을때와 안 주었을때 그리고 함수로 순차 수행했을때 차이를 보여주는 예제 입니다.

코드 내용
/*
	저작권 표기
	네이버 지식인 : C 쓰레드 예제에서 에러가 납니다... 고수님들 도와주세요~~ 
	http://kin.naver.com/db/detail.php?d1id=1&dir_id=10104&eid=0bUQ1CpEfllQ+RSELTqBVtOEPnrGHJN/&qb=vrK3ubXl
	http://cakel.tistory.com

	교육용을 목적으로 자유롭게 배포 할수 있습니다.

	thread_dsp.cpp : 극한의 상황을 줘서 지연을 주었을때,
	안주었을 때의 스레드 처리 순서와 함수로 줬을때 처리 순서를 나타내는 프로그램입니다.
        WIN32 의 함수를 사용했습니다.


*/

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

void dsp1(void *param)
{	// 100 ms 를 단위로 한줄을 출력을 하는 함수 입니다.
	int i = 0;
	for (i=0; i<10; i++)
	{
		printf("[1]%d\n",i);
		Sleep(100);
	}

	printf("dsp1 수행 완료\n");

}

void dsp2(void *param)
{	// 100 ms 를 단위로 한줄을 출력을 하는 함수 입니다.
	int i = 0;
	for (i = 0; i< 10; i++)
	{
		printf("[2]%d\n", i);
		Sleep(100);
	}

	printf("dsp2 수행 완료\n");

}

void dsp3(void *param)
{	// delay 없이 한줄을 바로 출력하는 함수입니다.
	int i = 0;
	for (i=0; i<10; i++)
	{
		printf("[3]%d\n",i);
	}

	printf("dsp3 수행 완료\n");

}

void dsp4(void *param)
{	// delay 없이 한줄을 바로 출력하는 함수입니다.
	int i = 0;
	for (i = 0; i< 10; i++)
	{
		printf("[4]%d\n", i);
		}

	printf("dsp4 수행 완료\n");

}

int main()
{
	// 스레드의 주소를 담는 핸들을 선언합니다.
	HANDLE th1, th2;
	
	// Race condition(경쟁조건) 에서 수행합니다.
	printf("Sleep(100)을 쓰고 스레드 1, 2를 실행 합니다.\n");
	th1 = (HANDLE)_beginthread(dsp1, 0, NULL);
	th2 = (HANDLE)_beginthread(dsp2, 0, NULL);

	// 스레드 완료를 위해 무한으로 기다립니다.
	WaitForSingleObject(th1, INFINITE);
	WaitForSingleObject(th2, INFINITE);

	printf("아무키를 치면 다시 딜레이 없이 바로 스레드 3, 4를 실행합니다.\n");
	
	_getch();	// 아무키를 입력받습니다.

	// 원래는 1번과 2번 스레드가 동시에 일어나므로 느린 PC 에서는 같이 출력될수 있습니다.
	
	// 다시 스레드를 구동합니다.
	th1 = (HANDLE)_beginthread(dsp3, 0, NULL);
	th2 = (HANDLE)_beginthread(dsp4, 0, NULL);

	// 스레드 완료를 위해 무한으로 기다립니다.
	WaitForSingleObject(th1, INFINITE);
	WaitForSingleObject(th2, INFINITE);

	printf("아무키를 치면 하나의 Sleep(100)을 쓴 함수 1, 2(프로시져)로 수행합니다.\n");

	_getch();	// 아무키를 입력받습니다.

	// 단일 함수로써 dsp1(), dsp2() 함수로 호출합니다.
	// NULL 과 0 은 같은 역할을 합니다.
	dsp1(NULL);
	dsp2(0);

	printf("수행완료 프로그램 끝\n");

	return 0;

}