首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

消息队列的设计与实现(2)

消息队列的设计与实现(2)

写操作如上面的流程图介绍,写操作主要包括如下几步:- 获取锁;
  • 判断队列是否已满;
  • 若没满,将数据写入 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 程序来讲,还需要一个消息循环与消息队列一起工作,消息循环将单独总结
继承事业,薪火相传
返回列表