쓰레드 생성 함수 ----------------------------------------------------------------------------------------------

HANDLE WINAPI CreateThread(
  __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in       SIZE_T dwStackSize,
  __in       LPTHREAD_START_ROUTINE lpStartAddress,
  __in_opt   LPVOID lpParameter,
  __in       DWORD dwCreationFlags,
  __out_opt  LPDWORD lpThreadId
);
함수 인자 

----------------------

1. __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, 

-> 쓰레드가 생성되면 당연히 그에 대한 핸들이 생성된다. 이 인자에 NULL이 전달되면 핸들은 자식 프로세스 생성 시 상속 대상에서 제외된다.

----------------------

2. __in SIZE_T dwStackSize,

-> 쓰레드 생성시 해당 쓰레드를 위한 스택이 별도 생성된다는 것은 앞서 설명되었다. 0이 전달되면 이 쓰레드의 스텍 크기는 1M로 적용된다.

----------------------

3. __in LPTHREAD_START_ROUTINE lpStartAddress,

-> 쓰레드로 동작하기 위한 함수, 다시 말해서 쓰레드의 MAIN함수 역할을 하는 함수를 지정하는 전달 인자이다. 정확히 말하자면 함수의 포인터가 인자값으로 들어가야만 한다. 이 인자는 다음과 같이 재정의 되어 있다.

typedef DWORD (WINAPI *PTHREAD_START_ROUTINE) (LPVOID lpThreadParameter);

typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; 

따라서 반환타입이 DWORD이고 매개변수 타임은 LPVOID(void*)인 형태로 함수가 정의 되어야 한다.

----------------------

4. __in_opt LPVOID lpParameter,

-> 쓰레드 함수에 전달할 인자를 지정하는 용도로 사용한다. main 함수에서 argv로 문자열이 전달되는 것과 유사하다.

---------------------- 5. __in DWORD dwCreationFlags,

쓰레드의 생성 및 실행을 조절하기 위한 전달인자. 각 플레그가 존재하며 몇가지 설명하자면.

CREATE_SUSPENDED가 전달되면, 쓰레드는 생성과 동시에 Blocked 상태에 놓이게 된다. 그러나 ResumeThread가 호출되면 실행을 시작한다.

XP이상의 윈도우 버전에서는 STACK_SIZE_PARAM_IS_A_RESERVATION을 전달 할수 있는데 이 경우 dwStackSize를 통해 전달되는 값의 크기는 reserve 메모리 크기를 의미하게 되고, 그렇지 않은 경우는 commit 메모리 크기를 의미하게 된다.

---------------------- 6. __out_opt LPDWORD lpThreadId

쓰레드 id를 전달받기 위한 변수의 주소값을 전달한다. 굳이 필요 없다면 NULL을 전달해도 좋다. Windows ME이하 버전에서는NULL을 전달 할 수 없기 때문에 범용적인 사용을 위해서라도 주소값을 전달하는게 좋다.

7. 함수 호출이 성공하면 생성된 쓰레드의 핸들이 반환된다.


쓰레드 생성에 있어서 주의할 사항은 쓰레드는 메모리가 허용하는 만큼만 생성이 가능하다. 쓰레드가 하나 생성될 때마다 독립된 스택을 할당해야 하므로 스택을 할당할 수 있을 때까지 쓰레드의 생성이 허용된다.


또한 이 함수로 생성된 쓰레드는 커널영역에서 스케줄러에 의해서 관리된다.


Posted by JJOREG