2015. 7. 23. 02:25ㆍ프로그래밍/서버
정의
스레드란 프로그램을 실행시키는 하나의 흐름에 대한 단위.
*윈도우즈에서는 이 하나의 단위로 스케줄링이라는 작업을 한다.
스레드는 왜 쓰는가?
- 계산이 오래 걸리는 연산을 수행하는 동안 다른 일을 하고 싶을 때.
- 응답이 언제 올지 모르는 작업을 수행시켜놓고 다른 일을 하고 싶을 때.
- 여러 개의 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()
'프로그래밍 > 서버' 카테고리의 다른 글
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 |