Programming Language/C, C++

멀티스레드 (스레드함수)

MOLOKINI 2014. 5. 13. 23:17

멀티스레드, 동시에 실행되는 함수로 사실은 병렬처리되는게 아니라 멀티태스킹 스타일로 선형적(직렬) 처리가 됩니다.

그런데 사람이 인지할 수 없을 정도의 직렬처리라 그냥 병렬처리되는것 처럼 보일 뿐입니다.

 

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