C++ 队列的实现
- /************************************************************************/
- /* 实现一个通用同步队列
- 使用链表实现队列 (先入先出)
- 使用信号量等待实现同步
- /************************************************************************/
- #pragma once
- #include "lock.h"
- #include <list>
- template <typename Type>
- class Queue
- {
- public:
- inline Queue()
- {
- bInit = true;
- count = ;
- semaphore.Create(0xFFFF);
- }
- inline ~Queue()
- {
- Close();
- }
- inline void Close()
- {
- if(bInit) {
- bInit = false;
- semaphore.Release(); //释放信号 让正在wait的就返回
- semaphore.Close();
- }
- }
- inline int getCount()
- {
- return count;
- }
- inline bool Push(Type* type)
- {
- if(!bInit)
- return false;
- criticalsection.Lock();
- queueList.push_back(type);
- count++;
- criticalsection.Unlock();
- semaphore.Release(); //发出信号 让Pop可以操作了
- return true;
- }
- inline Type* Pop()
- {
- semaphore.Wait(INFINITE); //等待Push的信号发来后才进行动作
- if(bInit == false)
- return ;
- criticalsection.Lock();
- Type *type = *(queueList.begin()); //取出链表头
- queueList.pop_front(); //从链表弹出
- count--;
- criticalsection.Unlock();
- return type;
- }
- private:
- bool bInit;
- int count;
- Semaphore semaphore;
- CriticalSection criticalsection;
- std::list<Type*> queueList;
- };
其中用到了简单包装的Semaphore和CriticalSection
如下:
- //临界区
- class CriticalSection
- {
- public:
- inline CriticalSection()
- {
- InitializeCriticalSection(&m_sect);
- }
- inline ~CriticalSection()
- {
- DeleteCriticalSection(&m_sect);
- }
- inline void Lock()
- {
- EnterCriticalSection(&m_sect);
- }
- inline void Unlock()
- {
- LeaveCriticalSection(&m_sect);
- }
- inline BOOL TryLock()
- {
- return TryEnterCriticalSection(&m_sect);
- }
- private:
- CRITICAL_SECTION m_sect;
- };
- //信号量
- class Semaphore
- {
- public:
- inline Semaphore()
- {
- m_hSem = NULL;
- }
- inline ~Semaphore()
- {
- Close();
- }
- inline BOOL Create(LONG lMaximumCount)
- {
- m_hSem = CreateSemaphore(NULL, , lMaximumCount, NULL);
- return (m_hSem != NULL);
- }
- inline void Close()
- {
- if (m_hSem)
- {
- CloseHandle(m_hSem);
- m_hSem = NULL;
- }
- }
- inline BOOL Release(LONG lReleaseCount)
- {
- return ReleaseSemaphore(m_hSem, lReleaseCount, NULL);
- }
- inline DWORD Wait(DWORD dwMilliseconds)
- {
- return WaitForSingleObject(m_hSem, dwMilliseconds);
- }
- public:
- HANDLE m_hSem;
- };
C++ 队列的实现的更多相关文章
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- Beanstalkd一个高性能分布式内存队列系统
高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
随机推荐
- js +1的动画效果
var fnPlusAnimate = function(str, options){ if (typeof str === 'object') { options = str; str = unde ...
- 修改VS 所有项目的Include目录和Lib目录
像以前的方法 在 工具--选项--项目和解决方案里的修改已经被弃用.
- dede channel 增加limit(属性)功能
dede channel 标签添加 limit(属性)功能 在用dede建站的时候,往往会需要用到一些需要自定义的普通需求,今天在这里介绍channel的limit功能,有时候我们需要调用中间部分数据 ...
- 深入理解javascript--笔记
书写可维护的代码 1,最小全局变量 在js中不用声明变量就可以直接使用,因此注意不要没有声明就使用.(无意中创建的全局变量)比如使用任务链进行var声明.var a=b=12;正确写法为var ...
- Myeclipse非正常关闭出现问题
Could not create the view: An unexpected exception was thrown. 解决办法: 关闭myeclipse 原来工作空间的.metadata文件夹 ...
- pthread_create 内存释放
run() { pthread_attr_destroy(&m_attr); pthread_detach(pthread_self()); }
- python之模块安装
在python中,python官方提供了很多可以扩展的包,用以增强python的功能. 因为用到了excel的读写功能,需要安装xlrd的包,一下是安装步骤 1.首先从python的官方库下载相应的包 ...
- FizzBuzz 问题
public class FizzBuzz { static int start = 1; static int end = 100; public static void main(String[] ...
- TimeStamp
private void Form1_Load(object sender, EventArgs e) { textBox1.Text= GenerateTimeStamp(System.DateTi ...
- python之购物车的编写(熬夜撸代码中。。。)
购物车的编写对于我这种不是很精通函数的小白来说,简直太难了.各种坑,各种无奈啊!不过总算也是写出来了! 不多说,直接上代码! #!/usr/bin/env python#用户名 sanjiang#密码 ...