Message queue callback in c language
Message queue callback?
message queue callback이란 message를 보내서 queue에 저장하면 callback으로 저장된 message가 전달되는 구조입니다.언제 사용되는가?
일반적으로 lib의 callback을 user쪽에 구현하는 경우, 해당 callback에서 함수를 만들어 처리하는 경우가 많습니다. 하지만 lib의 callback은 실제로 lib내부에 존재하는 형태라는 것을 알아야 합니다. 따라서 lib callback에서 시간을 많이 소비하는 경우에는 사용하는 lib가 오동작 할 수 있습니다.이렇기 때문에 lib에서 제공한 callback을 user쪽에서 사용하는 경우에는 전달된 data를 queue에 담아놓고 다른 thread에서 처리하는 것이 좋습니다. 이것을 지원하기 위해 message queue callback을 사용했습니다.
구조 분석
샘플 소스 분석
git clone https://github.com/juwith/jsutils.git
git checkout 707a7e09a96ac611fb1c2a193bf0ee21ea3065fd
cd message_queue
|
message를 보내면, queue에 저장을 합니다.
즉, message를 보내면 일정 시간마다 user에게 다시 메세지를 전달해줍니다.
message send
void _message_send(Message* msg, void* item) { pthread_mutex_lock(&msg->msgMtx); Queue* q = msg->queue; Queue_Enqueue(q,item); pthread_mutex_unlock(&msg->msgMtx); }
message 쓰레드
void* _message_thread(void* msg) { Message* pMsg = (Message*)msg; pMsg->threadAlive = true; Queue* pQ = pMsg->queue; void* item = NULL; while(pMsg->threadAlive) { pthread_mutex_lock(&pMsg->msgMtx); item = Queue_Dequeue(pQ); if(item != NULL) { pMsg->cb.msg_process(pMsg,item); } pthread_mutex_unlock(&pMsg->msgMtx); usleep(pMsg->msgThrIntv); } pthread_exit(NULL); //set return val if it is }
아래와 같은 구조로 사용이 가능합니다.


댓글
댓글 쓰기