message queue implementation by c++ STL

Program Lang./C++ 2017. 4. 6. 19:37

1. 목적

내 기억으로는 c++ STL에는 IPC 기능을 제공하는 Container가 존재하지 않는 것 같다. 결국 POSIX 같은 리눅스/유닉스 기반 IPC를 혼합해서 써야 하는 것인지 의문이다. c++ 공부 차원에서 Thread간 통신을 위해서 Message Queue를 한번 구현해 봤다. 많은 것을 고민하였으나 부족한 점이 많아 보인다. 부족한 점은 잘 잊혀버리니까 정리차원에서 아래에 기술하도록 한다.



2. 테스트 코드

코드의 전체 구성은 다음과 같다. class CMessageQueue와 class CMessageQueuePool로 구성되어 있다. CMessageQueuePool은 각각의 이름으로 생성된 CMessageQueue를 관리하기 위한 목적 이외에는 다른 사용 목적은 없다. CMessageQueuePool은 SingleTon 형식으로 만들려고 했는데 정확히 맞는지 확신은 없다. 일단 상속은 생각하지 않았다. 내 기억으로는 Boost에서는 SingleTon을 상속 받아서 처리하면 매우 쉬운것으로 알고 있다. 사실 CMessageQueuePool은 별개 없고 실제 동작은 CMessageQueue에서 이루어진다.


그럼 CMessageQueue를 살펴보면 std::queue<T>와 std::mutex 맴버변수가 있고 전송과 수신 메세지 맴버함수로 이루어져 있다. std::queue<T>는 실제 주고 받을 메세지가 저장되는 Queue이다. template를 사용한 목적은 메세지의 형식이 목적에 따라 다르기 때문에 template로 처리하였다. std::mutex는 std::queue<T>를 전송과 수신 쓰레드에서 각각 접근하는 공유자원이다. 따라서 mutex로 동기를 맞추기 위해서 추가하였다.


한가지 아쉬운 점은 CMessageQueue는 CMessageQueuePool에서만 객체를 생성할 수 있도록 하고 쉽은데, 몇 가지 이유로 쉽지 않다. CMessageQueue를 CMessageQueuePool 내부에 집어 넣으면 getMessageQueue() 함수처럼 CMessageQueue를 리턴 받아야 하는 함수를 어떻게 처리할 지 의문이다. CMessageQueue를 리턴 받지 않고 모두 CMessageQueuePool 내부에서 처리하도록 하면은 매번 messageQueue 이름으로 CMessageQueue의 객체를 뒤져야 하는 성능상의 단점이 있다. 이 부분은 좀 더 고민을 해 봐야 겠다.



3. 테스트 코드 실행

실행을 시켜보면 의도한 되로 정상동작한다. MesasgeQueue 전송 시에는 강제로 MessageQueue Empty 환경을 만들기 위해서 delay를 500ms 주고 던졌다. 수신쪽에서는 MessageQueue가 비어있으면 pthread condition 변수에 의해서 Task를 대기 시킴으로써 불필요한 CPU 점유률과 사용을 제거하였다.


 Trace in [getInstance,198]  
 Trace in [CMessageQueue,86]  
 Debug in [createMessageQueue,227]  
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 0
 
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 1
 
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 2
 
 Debug in [isMessageQueueEmpty,166]  
[receiveMessage,143] Message Queue Empty Condition 
 Debug in [sendMessage,112]  
 Debug in [isMessageQueueEmpty,166]  
 Debug in [receiveMessage,153]  
[operator(),287] received data : 3


'Program Lang. > C++' 카테고리의 다른 글

[Basic] 생성자 호출 정리  (0) 2017.04.26
boost asio를 이용한 iptuner 제작  (0) 2017.04.11
enable_shared_from_this 정리  (0) 2017.01.12
[json-c] simple generator json ojbect  (0) 2017.01.09
[json-c] simple parsing example  (0) 2017.01.09
: