当前位置:  编程技术>c/c++/嵌入式

基于条件变量的消息队列 说明介绍

    来源: 互联网  发布时间:2014-10-12

    本文导语:  条件变量是线程之前同步的另一种机制。条件变量给多线程提供了一种会和的场所。当条件变量和互斥锁一起使用时,允许线程以无竞争的方式等待特定的条件发生。这样大大减少了锁竞争引起的线程调度和线程等待。      ...

条件变量是线程之前同步的另一种机制。条件变量给多线程提供了一种会和的场所。当条件变量和互斥锁一起使用时,允许线程以无竞争的方式等待特定的条件发生。这样大大减少了锁竞争引起的线程调度和线程等待。

     消息队列是服务器端开发过程中绕不开的一道坎,前面,我已经实现了一个基于互斥锁和三队列的消息队列,性能很不错。博客园中的其他园主也实现了很多基于环形队列和lock-free的消息队列,很不错,今天我们将要实现一个基于双缓冲、互斥锁和条件变量的消息队列;这个大概也参考了一下java的blockingqueue,在前面一个博客中有简单介绍!!基于三缓冲的队列,虽然最大限度上解除了线程竞争,但是在玩家很少,消息很小的时候,需要添加一些buff去填充数据,这大概也是其一个缺陷吧!

     消息队列在服务器开发过程中主要用于什么对象呢?

     1: 我想大概就是通信层和逻辑层之间的交互,通信层接受到的网络数据,验证封包之后,通过消息队列传递给逻辑层,逻辑层将处理结果封包再传递给通信层!

     2:逻辑线程和数据库IO线程的分离;数据库IO线程负责对数据库的读写更新,逻辑层对数据库的操作,封装成消息去请求数据库IO线程,数据库IO线程处理完之后,再交回给逻辑层。

     3:日志;处理模式与方式2 类似。不过日志大概是不需要返回的!

给出源代码:

BlockingQueue.h文件

代码如下:

/*
 * BlockingQueue.h
 *
 *  Created on: Apr 19, 2013
 *      Author: archy_yu
 */

#ifndef BLOCKINGQUEUE_H_
#define BLOCKINGQUEUE_H_

#include
#include

typedef void* CommonItem;

class BlockingQueue
{
public:
    BlockingQueue();

    virtual ~BlockingQueue();

    int peek(CommonItem &item);

    int append(CommonItem item);

private:

    pthread_mutex_t _mutex;

    pthread_cond_t _cond;

    std::queue _read_queue;

    std::queue _write_queue;

};

 
#endif /* BLOCKINGQUEUE_H_ */

BlockingQueue.cpp 文件代码
代码如下:

/*
 * BlockingQueue.cpp
 *
 *  Created on: Apr 19, 2013
 *      Author: archy_yu
 */

#include "BlockingQueue.h"

BlockingQueue::BlockingQueue()
{
    pthread_mutex_init(&this->_mutex,NULL);
    pthread_cond_init(&this->_cond,NULL);
}

BlockingQueue::~BlockingQueue()
{
    pthread_mutex_destroy(&this->_mutex);
    pthread_cond_destroy(&this->_cond);
}

int BlockingQueue::peek(CommonItem &item)
{

    if( !this->_read_queue.empty() )
    {
        item = this->_read_queue.front();
        this->_read_queue.pop();
    }
    else
    {
        pthread_mutex_lock(&this->_mutex);

        while(this->_write_queue.empty())
        {
            pthread_cond_wait(&this->_cond,&this->_mutex);
        }

        while(!this->_write_queue.empty())
        {
            this->_read_queue.push(this->_write_queue.front());
            this->_write_queue.pop();
        }

        pthread_mutex_unlock(&this->_mutex);
    }

 
    return 0;
}

int BlockingQueue::append(CommonItem item)
{
    pthread_mutex_lock(&this->_mutex);
    this->_write_queue.push(item);
    pthread_cond_signal(&this->_cond);
    pthread_mutex_unlock(&this->_mutex);
    return 0;
}

测试代码:
代码如下:

BlockingQueue _queue;

void* process(void* arg)
{

    int i=0;
    while(true)
    {
        int *j = new int();
        *j = i;
        _queue.append((void *)j);
        i ++;
    }
    return NULL;
}

int main(int argc,char** argv)
{
    pthread_t pid;
    pthread_create(&pid,0,process,0);

    long long int start = get_os_system_time();
    int i = 0;
    while(true)
    {
        int* j = NULL;
        _queue.peek((void* &)j);

        i ++;

        if(j != NULL && (*j) == 100000)
        {
            long long int end = get_os_system_time();
            printf("consume %dn",end - start);
            break;
        }
    }

    return 0;
}


    
 
 

您可能感兴趣的文章:

  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 条件变量和互斥量区别
  • linux里的条件变量到底有什么用?感觉和mutex差不多啊
  • 关于多线程编程的条件变量问题
  • 关于条件变量的问题
  • 条件变量是不是一定要搭配互斥锁才能发挥作用?
  • 条件编译可以使用全局变量吗?
  • 一个线程里头可以等待多过条件变量吗?
  • 有关条件变量的源代码在哪找得到呢?
  • 线程里互斥和条件变量一起使用的问题,有点迷惑.
  • 我觉得POSIX的线程里的条件变量的API设计得很不合理!
  • 看到线程的条件变量这部分时有些糊涂!
  • 关于条件变量的使用
  • 【求助】请教一下关于条件变量的一个问题。
  • 帮忙看看makefile 中关于变量的条件赋值 的问题吧?不搞定我下周就死了
  • 如何不留后遗症地取消处于等待条件变量信号的线程?
  • 条件变量和互斥量结合的使用问题
  • 关于 互斥和条件变量 的疑问
  • SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法
  • 谁知道条件变量的用法??用 pthread_cond_timedwait()时遇到了问题
  • pthread_cond_timedwait带时间的线程同步条件变量用法,请教!谢谢
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Lists(链表) 成员 remove_if():按指定条件删除元素
  • 散分(有条件,很简单的条件)
  • win7,win8安装docker的依赖条件
  • C#.NET学习笔记5 C#中的条件编译
  • Mysql设置查询条件(where)查询字段为NULL
  • 删除一定条件下列出的文件
  • 带搜索条件的分页怎么做?
  • linux->shell-> if 条件判断,关于软连接的判断!
  • Shell条件判断疑问?
  • 如何在Makefile中定义宏进行条件编译?
  • MySQL中使用case when 语句实现多条件查询的方法
  • 预处理器条件删除工具 unifdef
  • 编译条件“-lpthread”应该加在makefile的哪里阿?
  • 有无条件等待指令吗?
  • linux环境下oracle条件导出数据的shell脚本怎么写
  • 有n个进程的系统出现死锁,死锁进程个数k应该满足什么条件?
  • 动态生成的查询条件其参数传递如何实现?
  • grep 搜索条件与的问题
  • shell编程 if语句的条件总是被判断为真
  • python字典多条件排序方法实例
  • 关于可移植代码中的条件编译


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3