728x90

윈도우에서의 쓰레드 생성

- CreateThread : 성공 시 쓰레드 핸들, 실패 시 NULL 반환

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,	// 핸들 상속 여부 결정
  SIZE_T                  dwStackSize,		// 독립 stack의 크기(기본 1MB)
  LPTHREAD_START_ROUTINE  lpStartAddress,		// 쓰레드로 동작하기 위한 함수(쓰레드 main)
  LPVOID lpParameter,					// 쓰레드 함수에 전달할 인자
  DWORD                   dwCreationFlags,		// 생성 옵션
  LPDWORD                 lpThreadId			// 쓰레드 ID
);

- _beginthreadex : 성공 시 쓰레드 핸들, 실패 시 0 반환

    -> ANSI 표준 C라이브러리는 쓰레드 기반에 안정적이지 않음

    -> 동시접근 문제

    -> _beginthreadex는 내부적으로 createThread 함수를 호출해주고 쓰레드별로 별도의 메모리 공간을 할당

    -> createThread 함수 호출을 통해 생성되는 쓰레드는 C/C++ 표준 함수에 대해 안정적으로 동작하지 않음

    -> createThread 함수와 매개 변수는 같음

#include <process.h>

uintptr_t _beginthreadex(void *_Security, 
          unsigned _StackSize, 
          unsigned (void *),
          void *_ArgList,
          unsigned _InitFlag,
          unsigned *_ThrdAddr);

- 생성 가능한 쓰레드의 갯수

    -> OS가 지정할 수 있고 상황에 따라 다름

    -> 보편적으로 허용할 수 있는 만큼 생성 가능

#include <stdio.h>
#include <windows.h>
#include <process.h>    /* _beginthreadex, _endthreadex */

unsigned ThreadFunc(void *arg);
unsigned int maxCnt = 0;

int main(int argc, char *argv[])
{
    HANDLE hThread;
    int param=5;

    while(1) {
        hThread=(HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)&param, 0, &maxCnt);
        if(hThread==0)
        {
            printf("Thread max cnt = %d\n",maxCnt);
            return -1;
        }
        maxCnt++;
    }
    puts("end of main");
    return 0;
}

unsigned ThreadFunc(void *arg)
{
    int i;
    int cnt=*((int*)arg);
    for(i=0; i<cnt; i++)
    {
        puts("running thread");
    }
    return 0;
}

 

728x90

+ Recent posts