Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C 프로그램의 Windows 스레드 API

<시간/>

스레드는 CreateThread() 함수를 사용하여 Windows API에서 생성되며 Pthread에서와 마찬가지로 보안 정보, 스택 크기 및 스레드 플래그와 같은 속성 집합이 이 함수에 전달됩니다. 아래 프로그램에서는 이러한 속성에 대한 기본값을 사용합니다. (기본값은 처음에 스레드를 일시 중단된 상태로 설정하지 않고 대신 CPU 스케줄러에서 실행할 수 있도록 합니다.) 합계 스레드가 생성되면 부모는 합계 값을 출력하기 전에 완료될 때까지 기다려야 합니다. 값이 합산 스레드에 의해 설정되기 때문입니다. Pthread 프로그램에서 부모 스레드가 pthread join() 문을 사용하여 합산 스레드를 기다리게 했습니다. 여기에서 WaitForSingleObject() 함수를 사용하여 Windows API에서 이와 동등한 작업을 수행하여 생성 스레드가 차단될 때까지 합계 스레드가 종료되었습니다. 여러 스레드가 완료될 때까지 기다려야 하는 상황에서는 WaitForMultipleObjects() 함수가 사용됩니다. 이 함수에는 4개의 매개변수가 전달됩니다. -

  • 대기할 개체 수
  • 객체 배열에 대한 포인터
  • 모든 개체가 신호를 받았는지 여부를 나타내는 플래그입니다.
  • 시간 초과 기간(또는 INFINITE)

예를 들어, THandles가 크기가 N인 스레드 HANDLE 개체의 배열인 경우 상위 스레드는 모든 하위 스레드가 이 명령문으로 완료될 때까지 기다릴 수 있습니다. -

WaitForMultipleObjects(N, Thandles, TRUE, INFINITE);

Windows API를 사용하는 다중 스레드 C 프로그램.

예시

#include<windows.h>
#include<stdio.h>
DWORD Sum;
/* data is shared by the thread(s) */
/* thread runs in this separate function */
DWORD WINAPI Summation(LPVOID Param){
   DWORD Upper = *(DWORD*)Param;
   for (DWORD i = 0; i <= Upper; i++)
   Sum += i;
   return 0;
}
int main(int argc, char *argv[]){
   DWORD ThreadId;
   HANDLE ThreadHandle;
   int Param;
   if (argc != 2){
      fprintf(stderr,"An integer parameter is required\n");
      return -1;
   }
   Param = atoi(argv[1]);
   if (Param < 0){
      fprintf(stderr,"An integer >= 0 is required\n");
      return -1;
   }
   /* create the thread */
   ThreadHandle = CreateThread( NULL, /* default security attributes */ 0, /* default stack size */    
   Summation, /* thread function */ &Param, /* parameter to thread function */ 0, /* default creation    flags */ &ThreadId);
   /* returns the thread identifier */
   if (ThreadHandle != NULL){
      /* now wait for the thread to finish */ WaitForSingleObject(ThreadHandle,INFINITE);
      /* close the thread handle */
      CloseHandle(ThreadHandle);
      printf("sum = %d\n",Sum);
   }
}