2 n Create Thread HANDLE Create Thread LPSECURITYATTRIBUTES
스레드 생성과 종료 (2) n Create. Thread() 함수 스레드 생성 후 스레드 핸들을 리턴 HANDLE Create. Thread ( LPSECURITY_ATTRIBUTES lp. Thread. Attributes, // NULL SIZE_T dw. Stack. Size, // 0 LPTHREAD_START_ROUTINE lp. Start. Address, // 스레드 함수 LPVOID lp. Parameter, // 스레드 함수에 전달할 인자 DWORD dw. Creation. Flags, // 0 또는 CREATE_SUSPENDED LPDWORD lp. Thread. Id // 스레드 ID ); 성공: 스레드 핸들, 실패: NULL TCP/IP 윈도우 소켓 프로그래밍 9
스레드 제어 – 우선순위 변경 (2) n 우선순위 클래스 REALTIME_PRIORITY_CLASS(실시간) HIGH_PRIORITY_CLASS(높음) ABOVE_NORMAL_PRIORITY_CLASS(높은 우선순위; 윈도 우 2000 이상) NORMAL_PRIORITY_CLASS(보통) BELOW_NORMAL_PRIORITY_CLASS(낮은 우선순위; 윈도 우 2000 이상) IDLE_PRIORITY_CLASS(낮음) TCP/IP 윈도우 소켓 프로그래밍 14
스레드 제어 – 우선순위 변경 (3) n 우선순위 레벨 THREAD_PRIORITY_TIME_CRITICAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_LOWEST THREAD_PRIORITY_IDLE TCP/IP 윈도우 소켓 프로그래밍 15
스레드 제어 – 스레드 종료 기다리기 (1) n Wait. For. Single. Object() 함수 특정 스레드가 종료할 때까지 기다리기 DWORD Wait. For. Single. Object ( HANDLE h. Handle, DWORD dw. Milliseconds ); 성공: WAIT_OBJECT_0 또는 WAIT_TIMEOUT, 실패: WAIT_F n Wait. For. Single. Object() 함수 사용 예 HANDLE h. Thread = Create. Thread(. . . ); DWORD retval = Wait. For. Single. Object(h. Thread, 1000); if(retval == WAIT_OBJECT_0) {. . . } // 스레드 종료 else if(retval == WAIT_TIMEOUT) {. . . } // 타임아웃(스레드는 아직 종료 안 else {. . . } // 에러 발생 TCP/IP 윈도우 소켓 프로그래밍 18
스레드 제어 – 스레드 종료 기다리기 (2) n Wait. For. Multiple. Objects() 함수 둘 이상의 스레드가 종료할 때까지 기다리기 DWORD Wait. For. Multiple. Objects ( DWORD n. Count, const HANDLE* lp. Handles, BOOL b. Wait. All, DWORD dw. Milliseconds ); 성공: WAIT_OBJECT_0 ~ WAIT_OBJECT_0 + n. Count-1 또는 WAIT_TIMEOUT 실패: WAIT_FAILED TCP/IP 윈도우 소켓 프로그래밍 19
스레드 제어 – 스레드 종료 기다리기 (3) n Wait. For. Multiple. Objects() 함수 사용 예 ① // 모든 스레드의 종료를 기다린다. HANDLE h. Thread[2]; HANDLE h. Thread[0] = Create. Thread(. . . ); HANDLE h. Thread[1] = Create. Thread(. . . ); Wait. For. Multiple. Objects(2, h. Thread, TRUE, INFINITE); TCP/IP 윈도우 소켓 프로그래밍 20
스레드 제어 – 스레드 종료 기다리기 (4) n Wait. For. Multiple. Objects() 함수 사용 예 ② // 스레드 하나의 종료를 기다린다. HANDLE h. Thread[2]; HANDLE h. Thread[0] = Create. Thread(. . . ); HANDLE h. Thread[1] = Create. Thread(. . . ); DWORD retval = Wait. For. Multiple. Objects(2, h. Thread, FALSE, INFINITE); switch(retval){ case WAIT_OBJECT_0: // h. Thread[0] 종료 break; case WAIT_OBJECT_0 + 1: // h. Thread[1] 종료 break; case WAIT_FAILED: // 오류 발생 break; } TCP/IP 윈도우 소켓 프로그래밍 21
멀티스레드 TCP 서버 (1) n 기본 구조 DWORD WINAPI Process. Client(LPVOID arg) { // ③ 전달된 소켓 저장 SOCKET client_sock = (SOCKET)arg; // ④ 클라이언트 정보 얻기 addrlen = sizeof(clientaddr); getpeername(client_sock, (SOCKADDR *)&clientaddr, &addrlen); } // ⑤ 클라이언트와 데이터 통신 while(1){. . . }. . . TCP/IP 윈도우 소켓 프로그래밍 24
멀티스레드 TCP 서버 (2) n 기본 구조(계속) int main(int argc, char *argv[]) {. . . while(1){ // ① 클라이언트 접속 수용 client_sock = accept(listen_sock, . . . ); . . . // ② 스레드 생성 Create. Thread(NULL, 0, Process. Client, (LPVOID)client_sock, 0, NU }. . . } TCP/IP 윈도우 소켓 프로그래밍 25
멀티스레드 TCP 서버 (3) n 소켓과 연관된 주소 정보 얻기 int getpeername ( SOCKET s, struct sockaddr *name, int *namelen ); 성공: 0, 실패: SOCKET_ERROR int getsockname ( SOCKET s, struct sockaddr *name, int *namelen ); 성공: 0, 실패: SOCKET_ERROR TCP/IP 윈도우 소켓 프로그래밍 26
임계 영역 (2) n 임계 영역 사용 예 #include <windows. h> CRITICAL_SECTION cs; DWORD WINAPI My. Thread 1(LPVOID arg) {. . . Enter. Critical. Section(&cs); // 공유 자원 접근 Leave. Critical. Section(&cs); . . . } DWORD WINAPI My. Thread 2(LPVOID arg) {. . . TCP/IP 윈도우 소켓 프로그래밍 33
이벤트 (3) n 이벤트 생성 HANDLE Create. Event ( LPSECURITY_ATTRIBUTES lp. Event. Attributes, BOOL b. Manual. Reset, BOOL b. Initial. State, LPCTSTR lp. Name ); 성공: 이벤트 핸들, 실패: NULL TCP/IP 윈도우 소켓 프로그래밍 37
Thank you TCP/IP 윈도우 소켓 프로그래밍 www. hanb. co. kr 38
- Slides: 38