1. /************************************************************************/
  2. /* 实现一个通用同步队列
  3. 使用链表实现队列 (先入先出)
  4. 使用信号量等待实现同步
  5. /************************************************************************/
  6. #pragma once
  7.  
  8. #include "lock.h"
  9. #include <list>
  10.  
  11. template <typename Type>
  12. class Queue
  13. {
  14. public:
  15. inline Queue()
  16. {
  17. bInit = true;
  18. count = ;
  19. semaphore.Create(0xFFFF);
  20. }
  21. inline ~Queue()
  22. {
  23. Close();
  24. }
  25.  
  26. inline void Close()
  27. {
  28. if(bInit) {
  29. bInit = false;
  30. semaphore.Release(); //释放信号 让正在wait的就返回
  31. semaphore.Close();
  32. }
  33. }
  34.  
  35. inline int getCount()
  36. {
  37. return count;
  38. }
  39.  
  40. inline bool Push(Type* type)
  41. {
  42. if(!bInit)
  43. return false;
  44.  
  45. criticalsection.Lock();
  46.  
  47. queueList.push_back(type);
  48. count++;
  49.  
  50. criticalsection.Unlock();
  51.  
  52. semaphore.Release(); //发出信号 让Pop可以操作了
  53. return true;
  54. }
  55. inline Type* Pop()
  56. {
  57. semaphore.Wait(INFINITE); //等待Push的信号发来后才进行动作
  58. if(bInit == false)
  59. return ;
  60.  
  61. criticalsection.Lock();
  62.  
  63. Type *type = *(queueList.begin()); //取出链表头
  64. queueList.pop_front(); //从链表弹出
  65. count--;
  66.  
  67. criticalsection.Unlock();
  68. return type;
  69. }
  70.  
  71. private:
  72. bool bInit;
  73. int count;
  74. Semaphore semaphore;
  75. CriticalSection criticalsection;
  76. std::list<Type*> queueList;
  77. };

其中用到了简单包装的Semaphore和CriticalSection

如下:

  1. //临界区
  2. class CriticalSection
  3. {
  4. public:
  5. inline CriticalSection()
  6. {
  7. InitializeCriticalSection(&m_sect);
  8. }
  9. inline ~CriticalSection()
  10. {
  11. DeleteCriticalSection(&m_sect);
  12. }
  13. inline void Lock()
  14. {
  15. EnterCriticalSection(&m_sect);
  16. }
  17. inline void Unlock()
  18. {
  19. LeaveCriticalSection(&m_sect);
  20. }
  21. inline BOOL TryLock()
  22. {
  23. return TryEnterCriticalSection(&m_sect);
  24. }
  25.  
  26. private:
  27. CRITICAL_SECTION m_sect;
  28. };
  29.  
  30. //信号量
  31. class Semaphore
  32. {
  33. public:
  34. inline Semaphore()
  35. {
  36. m_hSem = NULL;
  37. }
  38. inline ~Semaphore()
  39. {
  40. Close();
  41. }
  42. inline BOOL Create(LONG lMaximumCount)
  43. {
  44. m_hSem = CreateSemaphore(NULL, , lMaximumCount, NULL);
  45. return (m_hSem != NULL);
  46. }
  47. inline void Close()
  48. {
  49. if (m_hSem)
  50. {
  51. CloseHandle(m_hSem);
  52. m_hSem = NULL;
  53. }
  54. }
  55. inline BOOL Release(LONG lReleaseCount)
  56. {
  57. return ReleaseSemaphore(m_hSem, lReleaseCount, NULL);
  58. }
  59. inline DWORD Wait(DWORD dwMilliseconds)
  60. {
  61. return WaitForSingleObject(m_hSem, dwMilliseconds);
  62. }
  63.  
  64. public:
  65. HANDLE m_hSem;
  66. };

C++ 队列的实现的更多相关文章

  1. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  2. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  3. Beanstalkd一个高性能分布式内存队列系统

    高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...

  4. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  5. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  6. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  7. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  8. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  9. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  10. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

随机推荐

  1. js +1的动画效果

    var fnPlusAnimate = function(str, options){ if (typeof str === 'object') { options = str; str = unde ...

  2. 修改VS 所有项目的Include目录和Lib目录

    像以前的方法 在 工具--选项--项目和解决方案里的修改已经被弃用.

  3. dede channel 增加limit(属性)功能

    dede channel 标签添加 limit(属性)功能 在用dede建站的时候,往往会需要用到一些需要自定义的普通需求,今天在这里介绍channel的limit功能,有时候我们需要调用中间部分数据 ...

  4. 深入理解javascript--笔记

    书写可维护的代码 1,最小全局变量   在js中不用声明变量就可以直接使用,因此注意不要没有声明就使用.(无意中创建的全局变量)比如使用任务链进行var声明.var a=b=12;正确写法为var   ...

  5. Myeclipse非正常关闭出现问题

    Could not create the view: An unexpected exception was thrown. 解决办法: 关闭myeclipse 原来工作空间的.metadata文件夹 ...

  6. pthread_create 内存释放

    run() { pthread_attr_destroy(&m_attr);    pthread_detach(pthread_self()); }

  7. python之模块安装

    在python中,python官方提供了很多可以扩展的包,用以增强python的功能. 因为用到了excel的读写功能,需要安装xlrd的包,一下是安装步骤 1.首先从python的官方库下载相应的包 ...

  8. FizzBuzz 问题

    public class FizzBuzz { static int start = 1; static int end = 100; public static void main(String[] ...

  9. TimeStamp

    private void Form1_Load(object sender, EventArgs e) { textBox1.Text= GenerateTimeStamp(System.DateTi ...

  10. python之购物车的编写(熬夜撸代码中。。。)

    购物车的编写对于我这种不是很精通函数的小白来说,简直太难了.各种坑,各种无奈啊!不过总算也是写出来了! 不多说,直接上代码! #!/usr/bin/env python#用户名 sanjiang#密码 ...