멀티스레드, 동시에 실행되는 함수로 사실은 병렬처리되는게 아니라 멀티태스킹 스타일로 선형적(직렬) 처리가 됩니다.
그런데 사람이 인지할 수 없을 정도의 직렬처리라 그냥 병렬처리되는것 처럼 보일 뿐입니다.
TCP 서버/클라이언트에서도 문제점이 있는데, 스레드를 사용하지 않으면 두개의 클라이언트가 서버에 접속 할 경우 늦게 접속한 클라이언트는 메시지가 표시되지 않을 수 있다.
멀티스레드를 이용하면 이런 문제를 해결할 수 있다.
1. 스레드 생성
- 윈도우에서 스레드를 생성하려면 CreateThread() 함수를 사용해야 합니다.
- CreateThread() 함수는 스레드를 생성한 후 스레드 핸들을 리턴합니다, 스레드 핸들은 파일 디스크립터나 소켓 디스크립터와 비슷한 개념으로 스레드 관련 데이터 구조체를 간접적으로 참조하는 매개체가 됩니다.
- 스레드 생성
: 구조
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
);
: lpThreadAttributes - SECURITY_ATTRIBUTES 구조체 변수의 주소값을 대입한다.
핸들 상속과 보안 디스크립터 정보를 전달하는 용도, NULL이면 핸들
상속안됩니다요
: dwStackSize - 새로 생성할 스레드에 할당되는 스택 크기, 0을 사용하면 디폴트 1mb할당
: lpStartAddress - 스레드 함수의 시작 주소 (시작 메서드로 DWORD WINAPI 형 메서드)
: lpParameter - 스레드 함수에 전달할 인자, void형 포인터라서 32비트 크기의 값 하나만 전달
32비트보다 큰 값을 전달할 때에는 구조체 변수에 값을 넣고 이 구조체 주소
값을 전달, 전달할 인자가 없으면 NULL
: dwCreationFlags - 스레드 생성을 제어하는 값으로, 0 또는 CREATE_SUSPENDED를 사용
0을 사용하면 곧바로 실행되고, CREATE_SUSPENDED를 사용하면 스
레드 생성은 되지만 ResumeThread()함수를 호출하기 전가지는 실행
되지 않는다.
: lpThreadId - 변수 주소값으로 이 변수에 스레드 ID가 저장된다. 스레드 ID가 필요하지 않다
면 NULL값을 사용해도 된다.
- MFC에서 스레드를 만들 때 네번째 인자를 메서드가 속한 클래스 인스턴스를 넘겨주는 경우가 있습니다, MFC에서는 static형의 클래스이기 때문에, 외부에서 참조(스레드 메서드)가 불가하므로, 클래스 인스턴스를 전달한다. (콘솔이면 상관없습니다)
- 스레드 종료
: 구조
VOID WINAPI ExitThread(
_in DWORD dwExitCode // 종료코드
);
BOOL WINAPI TerminateThread(
_inout HANDLE hThread, // 종료할 스레드를 가리키는 핸들
_in DWORD dwExitCode // 종료코드
);
'Programming Language > C, C++' 카테고리의 다른 글
MFC에서 콘솔디버깅하기 (0) | 2014.05.13 |
---|---|
헝가리안 표기법 (0) | 2014.05.13 |
static을 이해합시다 (0) | 2014.05.13 |
디버깅용 __LINE__, __FILE__ 등등 (0) | 2014.05.13 |
반올림 매크로 - C++ (0) | 2014.05.13 |