Thread

2015. 7. 23. 02:25프로그래밍/서버

728x90
728x90

정의

스레드란 프로그램을 실행시키는 하나의 흐름에 대한 단위.


*윈도우즈에서는 이 하나의 단위로 스케줄링이라는 작업을 한다.


스레드는 왜 쓰는가?

- 계산이 오래 걸리는 연산을 수행하는 동안 다른 일을 하고 싶을 때.

- 응답이 언제 올지 모르는 작업을 수행시켜놓고 다른 일을 하고 싶을 때.

- 여러 개의 CPU를 이용하여 많은 작업을 동시에 처리하려고 할 때.

- 같은 작업을 여러 개의 스레드로 동시에 처리 하고 싶을 때.


C런타임 라이브러리

1
2
3
4
5
6
7
uintptr_t _beginthreadex( // NATIVE CODE    
void *security,    
unsigned stack_size,    
unsigned ( __stdcall *start_address )( void * ),    
void *arglist,    
unsigned initflag,    
unsigned *thrdaddr  );
cs


security - 보안 관련, 일단 다음에 알아보는 것으로 하고.. NULL

stack_size - 스레드에 할당될 스택의 크기

start_address - 관심 스레드의 함수 포인터

arglist - 관심 스레드에서 돌아갈 인자를 void*로 넘겨주고 형변환하여 사용한다.

initflag - 0(스레드 바로 생성) or CREATE_SUSPENDED(ResumeThread()를 이용해 시작)

thrdaddr - 생성된 스레드의 ID를 반환.


스레드 함수 원형

1
unsigned int _stdcall ThreadFunc(void* arglist);
cs


Win32 라이브러리

1
2
3
4
5
6
7
8
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // Security Descriptor
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreateionFlags, // thread identifier
LPDWORD lpThreadId // thread identifier
);
cs


인자들 순서와 사용법은 동일하다.


주의점?

두 함수의 가장 큰 차이점은 CreateThread() 함수로 만들어진

스레드 내에서 CRT 라이브러리 함수를 사용하면 스레드 종료시 

메모리 누수가 일어나므로 사용을 권장하지 않는다.


스레드 종료

기다리기

WaitForSingleObject() - 스레드가 종료될 때까지 기다힌다.


강제종료

이유

- 스레드가 크리티컬섹션에서 락이 걸려 락을 해제할 수 없는 상황

- 스레드가 힙에서 메모리에서 락이 걸려 있는 상태여서 락을 해제할 수 없는 상황

등등


원형

1
2
3
4
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);
cs


dwExitCodesmsgetExitCodeThread() 함수로 얻을 수 있다.


이외 함수

SuspendThread(), ResumeThread(), GetThreadPriority(), SetThreadPriority()

728x90
반응형

'프로그래밍 > 서버' 카테고리의 다른 글

vim 설치  (0) 2015.08.09
프라우드넷  (0) 2015.07.24
동기화  (0) 2015.07.23
Blocking vs Non-Blocking  (0) 2015.07.12
[서버] 데드 레커닝(Dead Reckoning)  (1) 2015.05.23
Overlapped I/O 모델  (0) 2015.05.17
IOCP 정리  (0) 2015.05.14