- UID
- 1029342
- 性别
- 男
|
写操作如上面的流程图介绍,写操作主要包括如下几步:- 获取锁;
- 判断队列是否已满;
- 若没满,将数据写入 write_pos 处,将 write_pos 增 1,并判断 write_pos 是否越界;
- 释放锁,并将信号量增 1。
/* lock the message queue */
pthread_mutex_lock (_msg_queue->lock);
/* check if the queue is full. */
if ((_msg_queue->write_pos + 1)% _msg_queue->size == _msg_queue->read_pos) {
/* Message queue is full. */
pthread_mutex_unlock (_msg_queue->lock);
return;
}
/* write a data to write_pos. */
_msg_queue -> msg [write_pos] = *msg;
write_pos ++;
/* check if write_pos if overflow. */
if (_msg_queue->write_pos >= _msg_queue->size)
_msg_queue->write_pos = 0;
/* release lock */
pthread_mutex_unlock (_msg_queue->lock);
sem_post (_msg_queue->wait);
读操作同理,读操作分如下几个步骤:
- 检查信号量;
- 获取锁;
- 判断队列是否为空;
- 若不为空,则读取 read_ops 处的数据,将 read_ops 增 1,并判断read_pos 是否越界;
- 并释放锁。
sem_wait (_msg_queue->wait);
/* lock the message queue */
pthread_mutex_lock (_msg_queue->lock);
/* check if queue is empty */
if (_msg_queue->read_pos != _msg_queue->write_pos) {
msg = _msg_queue->msg + _msg_queue->read_pos;
/* read a data and check if read_pos is overflow */
_msg_queue->read_pos ++;
if (_msg_queue->read_pos >= _msg_queue->size)
_msg_queue->read_pos = 0;
return;
}
/* release lock*/
pthread_mutex_unlock (_msg_queue->lock);
问题- 本文采用的环形队列是固定长度的,还可进一步改进,设计成可变长度的环形队列;
- 本文的消息队列是“先进先出”原则,没有考虑带优先级的消息,但这种场合是存在的;
- 本文重点介绍了消息队列的原理和实现,对于一个 GUI 程序来讲,还需要一个消息循环与消息队列一起工作,消息循环将单独总结
|
|