4. 멀티쓰레드 프로그래밍 2
실제
에코
서버
제작은
지난
강좌에서
끝났다. 이제
멀티
쓰레드
윈속
프로그래밍을
마무리하며 LXSCK 클래스를
한번
들여다
보고자
한다.
지난
강좌에서
잠시
언급하였
듯이 LXSCK 클래스는
소켓
통신을
위한
클래스이다. 이
클래스는
클래스가
생성되면서 2개의
부가적인
쓰레드를
생성한다. 각자의
쓰레드는
소켓을
읽거나
쓰는
데
쓰이며
소켓에
읽을
데이더가
있으면
버퍼가
허용하는
만큼의
데이터를
가져와
내부버퍼에
쌓아놓는다. 그러면 ReadLine()
또는 ReadDate()
멤버함수가
데이터를
읽어가게
된다. 쓰는
과정도
비슷하다. SendLine()
또는 SendData()
함수가
데이터를
버퍼에
쌓아놓으면
그
내용을
소켓을
통해서
보낸다. 실제적으로
쓰기
작업은
이렇게
중간에
버퍼를
둘
이유는
없으나
그냥
구조의
통일을
위해
굳이 2개의
쓰레드를
두었다.
그럼
소켁으로부터의
읽기
작업에는
총
몇개의
쓰레드가
버퍼를
억세스
할
수
있을
까? 1개라고
대답했다면
아직은
멀티쓰레드를
쉽게
생각했다. 정답은 2개다. 현재
실행중인
프로그램
자체가 1개의
쓰레드로서
버퍼를
억세스
한다.
즉, 2개의
쓰레드가
동일
버퍼를
억세스
할
수
있다. 그렇다는
것은
당연히
세마포의
도입이
필요하단
것을
깨달을
것이다.
LXSCK 클래스에서는
쓰레드를
만들면서
읽기/쓰기
세마포를
생성하여
버퍼를
억세스한다.
m_hReadSection = CreateSemaphore( NULL, 1, 1,
NULL);
m_hWriteSection =
CreateSemaphore( NULL, 1, 1, NULL);
실행프로그램의
읽기위한
ReadLine()함수를
보면
세마포가
릴리즈
되기를
기다리다
릴리즈
되면
크리티컬
섹션으로
들어가
버퍼를
억세스하고
버퍼를
다
쓴
후
다시
세마포를
읽기
쓰레드를
위해
릴리즈
하는
것을
볼
수
있다. 이것은
읽기
쓰레드
안에서
소켓으로
부터
읽은
데이터를
버퍼에
저장할
때도
마찬가지이다.
int LXSCK::ReadLine( LPSTR
szCommand, int nSize )
{
….
// Try to enter the semaphore
gate.
DWORD
dwWaitResult = WaitForSingleObject( m_hReadSection,
INFINITE);
… // 버퍼를
사용한다.
//DbgOut("Quit from READ - critical section -
ReadLine\n");
ReleaseSemaphore(
m_hReadSection, 1, NULL);
return iRet;
}
그럼
이제
다시
서버를
생각해
보자. 위에서
이러한
세마포를
사용한
크리티컬
섹션
접근
예를
보이는
이유는
멀티쓰레드
서버
프로그래밍에
있어선
필수요소이기
때문이다.
이
강좌에서
작성한
서버프로그래밍은
기본적인
멀티
쓰레드
서버를
보인
것으로서
간단히
입력을
다시
출력으로
보내주는
것으로서
서버에
당연히
있어야
할
내부
데이터
억세스가
없다. 그럼
이제
다시
서버에
대해
생각해보자. 예를
들어 SMTP/POP3
서버를
만든다고
해보자. 이메일
데이터에
접근할
수
있는
쓰레드가 2개
이상인가? 정답은
물론 “그렇다”이다. 새로
도착한
이메일이 SMTP 프로토콜을
통해
저장이
될
수
있을
것이며
동시에
유저가 POP3 프로토콜을
사용해
이메일을
읽어갈
수
있다.
앞서
보인
예제에서
각
클라이언트
접속은
한개의
쓰레드를
생성하게
되고
각
쓰레드는
마치
독립적인
프로그램처럼
움직인다. 이러한
쓰레드
들이
동시에
한
데이터를
접근하려고
한다면
당연히
우리는
세마포의
생성에
대해
고려하여야
한다.
필자가
강좌를
마치며
꼭
하고
싶었던
말은
이것이다. 멀티쓰레드
프로그래밍을
할
때는
쓰레드의
생성/삭제/제어를
고려해주어야
하며 – 이
부분은
이미
강좌에서
보였다 – 또한
각
쓰레드가
동일
데이터를
접근할
것에
대한
충분한
고려를
해주어야
한다. 그래야만
멀티쓰레드
프로그래밍이
완성될
수
있다.
아무쪼록
이
강좌를
읽는
회원들
중에서
실력있는
윈도우즈
프로그래머가
많이
나왔으면
하고
바라며
이에
허접했던
강좌를
마친다.
'[ Windows Program ] > Windows API' 카테고리의 다른 글
[WinAPI] The Message Loop (1) | 2011.08.25 |
---|---|
멀티쓰레드 윈도우즈 소켓 프로그래밍 #4 – 멀티쓰레드 프로그래밍 (0) | 2011.03.08 |
멀티쓰레드 윈도우즈 소켓 프로그래밍 #3 – 윈도우즈 서비스 프로그래밍 (0) | 2011.03.08 |
멀티쓰레드 윈도우즈 소켓 프로그래밍 #2 – 윈도우즈 서비스 프로그래밍 (2) | 2011.03.08 |
멀티쓰레드 윈도우즈 소켓 프로그래밍 #1 (0) | 2011.03.08 |