C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[37198] [질문]소켓과 스레드의 불안한 이중주...
땅주인 [] 1061 읽음    2004-09-10 14:41
특정한 코드에 대해서 질문 드리는 것은 아니구요...
전체적인 구성을 어떻게 해야 할 지 질문 드립니다.

지금 돌아가고 있는 로직은 그냥 TServerSocket의 read event에다가 처리 로직을
죄다 넣어서 처리하는 아주 단순 무식한 코딩을 해 놓았습니다.

대부분의 처리 로직이 소켓에서 데이터를 읽어서 DB에 필요한 내용을 INSERT/UPDATE/DELETE/SELECT하고
그 결과를 다시 소켓으로 쓰는 작업입니다. 소켓에 데이터가 몰리면 하나의 소켓 데이터 처리하느 동안에
다른 소켓의 데이터를 처리하지 못하거나 무지하게 늦게 처리되고 있습니다.

문제는 소켓에서 데이터를 읽어 오는 속도와 , 이를 처리하는 후처리 로직(주로 DB처리)간의 속도의 불균형으로
인한 문제을 어떻게 극복하는 가에 촛점이 맞추어집니다.

해결책으로 소켓과 메인 로직 사이에 버퍼를 두고, 메인 로직은 스레드로 구성하려 합니다.


Socket ----------------------> Queue ---------------------> 처리 로직(thread)
                    push()                                             pop()

생각으로는 소켓에서 데이터를 읽은 데이터를 ( 갈라져서 들어오기도 해서 pending 작업도 해야 함)
Queue에 넣고 Thread로 TEvent 객체를 통해서 Queue에 데이터가 들어와 있음을 알리면,
Thread는 WaitForSingleObject()로 기다리고 있다가 Event 메세지 받고 깨어나서 Queue에서 데이터를
빼내어 처리한다. 이런 정도로 정리가 되는데...

문제는 만약 TEvent로 Event로 알렸는데... 만약 Thread가 실행중에 있다면 이 Event 신호는 어떻게 되는 지요?
염려되는 것은 소켓에서 마구 들어오는 데이터로 큐를 채우고 스레드에 Evnet를 마구마구 날리면..
스레드가 이벤트를 까먹지 않을까 하는 염려가 돼서요....

그리고, 이러한 방법 이외에 다른 좋은 방법이 있다면 소개를 해주시면 감사하겠습니다.

+ -

관련 글 리스트
37198 [질문]소켓과 스레드의 불안한 이중주... 땅주인 1061 2004/09/10
37203     그냥 제 생각엔... smleelms 976 2004/09/10
37248         Re:그냥 제 생각엔... 땅주인 913 2004/09/13
37247         Re:그냥 제 생각엔... 땅주인 741 2004/09/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.