windows 에서의 thread  시스템프로그래밍 

2013.04.04. 11:06  수정  삭제

복사http://blog.naver.com/pwk0810/40186267845

전용뷰어 보기

+ 쓰레드에 안전한 C 표준 함수의 호출을 위한 쓰레드 생성

 

CreateThread 함수 호출을 통해서 생성되는  C/C++ 표준 함수에 대해서 안정적으로 동작하지 않는다.

 

beginthread 는 쓰레드 생성시 반환되는 핸들을 무효화 시켜서 커널 오브젝트에 접근할 수 있는 방법을 막아 버리는 문제점이 있다.

 

( 커널 오브젝트에 접근해야 하는 상황은 어떤 상황이 있을까? ...  프로세스간 통신을 제외하고은 음.. )

 

#include <process.h>

 

uintptr_t _beginthreadex( void *security, 

                                   unsigned stack_size,  

                                   unsigned (*start_routine ) ( void*) , 

                                   void *arglist,

                                   unsigned intiflag,

                                   unsigned *thrdaddr )

 

 

HANDLE hthread = _beginthreadex( NULL, 0 , ThreadFunc , (void*)&param, 0  , &threadId );

 

unsigned WINAPI ThreadFunc(void * arg){}

 

+ 핸들 , 커널 오브젝트, 그리고 ID 의 관계

 

  • 쓰레드도 운영체제에 의해서 관리되는 리소스 이기 때문에 커널 오브젝트의 생성을 동반
  • 따라서 커널 오브젝트를 참조할 수 있도록 핸들이 반환된다.
  • 핸들을 이용해서 여러 요청을 할 수 있다 " handle이 가리키는 쓰레드가 종료될때까지 대기"
  • 핸들을 통해서 커널 오브젝트의 구분이 가능하고, 커널 오브젝트를 통해서 쓰레드의 구분이 가능하다.
  • 쓰레드의 핸들이 쓰레드를 구분하는 용도로 사용된다.
  • 핸들의 정수값은 프로세스가 달라지만 중복될수 있다. 그러나 쓰레드의 ID는 프로세스의 영역을 넘어서서 중복되지 않는다.

 

Posted by 뉴암스테르담
l