본문 바로가기

[ Windows Program ]/Windows API

멀티쓰레드 윈도우즈 소켓 프로그래밍 #5– 멀티쓰레드 프로그래밍 2

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 프로토콜을 사용해 이메일을 읽어갈 있다.

 

앞서 보인 예제에서 클라이언트 접속은 한개의 쓰레드를 생성하게 되고 쓰레드는 마치 독립적인 프로그램처럼 움직인다. 이러한 쓰레드 들이 동시에 데이터를 접근하려고 한다면 당연히 우리는 세마포의 생성에 대해 고려하여야 한다.

 

필자가 강좌를 마치며 하고 싶었던 말은 이것이다. 멀티쓰레드 프로그래밍을 때는 쓰레드의 생성/삭제/제어를 고려해주어야 하며 부분은 이미 강좌에서 보였다 또한 쓰레드가 동일 데이터를 접근할 것에 대한 충분한 고려를 해주어야 한다. 그래야만 멀티쓰레드 프로그래밍이 완성될 있다.

 

아무쪼록 강좌를 읽는 회원들 중에서 실력있는 윈도우즈 프로그래머가 많이 나왔으면 하고 바라며 이에 허접했던 강좌를 마친다.

 

- Reference

  http://cafe.naver.com/nevernding