◆ 무한한 가능성/& Visual C/C++

Thread in C runtime library> example code. - Thread04

치로로 2009. 8. 19. 16:56

Thread in C runtime library> example code. - Thread04


//------------------------------------------------------------------------------
// C Runtime Library를 이용한 스레드 예제 - 시작
//------------------------------------------------------------------------------

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

#define ONEK 1024

typedef struct _SumInfo
{
 int a, b, s;
}SUMINFO, *PSUMINFO;            // a 에서 b까지의 합을 s에 저장

unsigned __stdcall Sum(void* p);
void WriteString(const char* lpszFormat, ...)    // 매개변수(...)의 처리 방법으로 매개변수 리스트 va_list를 사용
{
 char str[ONEK] = {0};
 va_list argList;            // 매개변수 리스트
 
 va_start(argList, lpszFormat);           // 매개변수 리스트를 하나씩 꺼냄
 vprintf(lpszFormat, argList);            // 런타임 함수
 va_end(argList);                         // 매개변수 리스트 사용 종료
}

void main()
{
 char temp[ONEK];
 unsigned dwThreadId;
 
 printf("*** 예제 [Thread04] C Runtime library를 이용한 스레드 예제 *** \n");
 
 // 기본 힙 메모리 오브젝트를 이용해서 메모리 할당
 PSUMINFO psi = (PSUMINFO)malloc(sizeof(SUMINFO));
 psi->a = 1;
 psi->b = 100;
 psi->s = 0;
 
 // 스레드 생성
 unsigned h = _beginthreadex(NULL, 0, Sum, psi, NULL, &dwThreadId);
 // NULL, 보인속성 SECURYTI_ATTRIBUTES 구조체 포인터
 // 0, 스레드가 실행도리 때 Commit상태의 스택 크기 설정
 // Sum, 스레드 오브젝트가 실행할 함수 포인터
 // psi, 스레드 함수에게 전달할 포인터. 일반적으로 데이터를 보냄
 // NULL, 스레드 함수 실행 옵션
 // &dwThreadId); 스레드 아이디를 리턴 받음
 
 
 if(h==0)   return;
 
 // 스레드의 상태를 확인하여 종료될 때를 기다린다.
 while (1)
 {
  DWORD dwWaitStatus = WaitForSingleObject((void *)h, 20);
  if(dwWaitStatus == WAIT_OBJECT_0)
  {
   CloseHandle((void *)h);
   break;
  }
  else if(dwWaitStatus == WAIT_TIMEOUT)
  {
   _putch('.');
  }
  else
  {
   break;
  }
 }
 
 scanf(temp);
 free(psi);
 _endthreadex(0);
}

// 스레드 함수: psi->a부터 psi->b까지의 합을 psi->s에 대입한다.
unsigned __stdcall Sum(void* p)
{
 PSUMINFO psi = (PSUMINFO)p;
 
 do    // psi->a부터 psi->b까지의 합을 psi->s에 대입한다.
 {
  psi->s += psi->a;
  Sleep(20);
 } while (psi->a++ != psi->b);
 WriteString(TEXT("\nSum Result: %d\n"), psi->s);
 return psi->s;
}


//------------------------------------------------------------------------------
// C Runtime Library를 이용한 스레드 예제 - 끝
//------------------------------------------------------------------------------



본 예제를 컴파일 할 때에는 Code Generation의
Use run-time library 를 Multi-thread 로 해야함