본문 바로가기

Today I Learned

23. 05. 17 - 스레드 관련 함수

스레드는 프로그래밍에서 두개 이상의 흐름이 필요할 때 사용한다.

이번에는 로딩하면서 화면에 출력을 동시에 하기 위해 스레드를 사용했다.

 

스레드들이 서로 공유하는 자원크리티컬 섹션이라고 한다.

서로 공유하기 때문에 동시에 두 개 이상의 스레드가 접근하면 문제가 발생할 수 있다.

그래서 이를 통제하기 위한 함수들이 존재한다.

InitializeCriticalSection으로 먼저 크리티컬 섹션을 초기화한다.

그리고 _beginthreadex함수로 스레드 함수로 루틴을 실행하는 스레드를 만들 수 있다.

 

uintptr_t _beginthreadex( // NATIVE CODE
   void *security,
   unsigned stack_size,
   unsigned ( __stdcall *start_address )( void * ),
   void *arglist,
   unsigned initflag,
   unsigned *thrdaddr
);

 

함수의 형태는 이렇게 되는데,  스레드 함수의 포인터가 start_address이며 함수는 __stdcall의  함수 호출 규약 형태여야 한다. 그리고 그 스레드 함수에 arglist를 매개변수로 전달한다.

 

스레드 함수 내에서 EnterCriticalSection과 LeaveCriticalSection을 사용한다.

Enter하고 Leave 전까지 한개의 스레드만이 접근할 수 있다.

 

	WaitForSingleObject(m_hThread, INFINITE);

	CloseHandle(m_hThread);

	DeleteObject(m_hThread);

	DeleteCriticalSection(&m_CriticalSection);

 

그리고 스레드를 가진 객체가 소멸될 때 WaitForSingleObject로 스레드의 함수가 끝날 때까지 기다릴 수 있다.

그 후 차례로 스레드를 삭제하고 크리티컬섹션까지 삭제한다.