Active Object Pattern on ACE Programming

게임서버를 작성하다보면 로직스레드 혹은 패킷처리 스레드에서 처리할수 없는 작업들이 있습니다. DB작업이 좋은 예인데, 블럭이 걸리기 때문에 별도의 스레드에서 처리를 해주어야 합니다. 정리하자면 로직 스레드에서 DB스레드에 이 작업을 처리해 달라고 요청을 해야하는 상황인데, 이럴때 Active Object 패턴을 적용할 수 있습니다.

실행하면 아래와 같이 차례대로 실행이 되는 것을 볼수 있습니다.
왼쪽에 숫자가 ThreadID입니다. Put Job과 실제 실행이 각자 다른 스레드에서 실행되고 있습니다. ACE_Method_Request를 상속받아서 call 메서드만 구현해주면 DBWorkerThread에서 알아서 실행해줍니다.

하지만 실제로는 결과값도 받아와야 하는 경우가 많죠. 이럴때 ACE_Future를 사용할 수 있습니다. 

Job을 넣기전에 ACE_Future를 발급받습니다. ACE_Future는 결과값을 받을수 있는 proxy라고 할수 있습니다. future.get()하면 결과값을 받을 수 있는데, WorkerThread에서 결과값을 넣기 전이라면 받을수 있을때까지 블럭이 걸립니다. 내부적으로는 event wait를 합니다. WorkerThread에서 작업이 끝나면 signal을 주고 get을 했던 스레드는 블럭이 풀리면서 값을 받아오게 되는 구조입니다. 그전에 작업이 완료되어 있으면 블럭없이 바로 받아올수 있습니다.

WorkerThread에서 작업이 끝나면 callback을 불러주는 식으로 구현도 가능합니다.

WorkerThread에서 작업이 끝나면 CompletionCallBack::update를 호출해 줍니다. 보통 작업 결과를 확인하고 응답패킷을 보내주는 코드를 넣으면 되겠죠.



핑백

덧글

댓글 입력 영역