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)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
随机推荐
- C#数据类型分类
C#是强类型语言,所以在定义每一个变量.常量和对象的时候都必须声明该类型. C#数据类型分为值类型.引用类型和指针类型(指针类型很少用): C#数据类型还可以分为内置类型.匿名类型和自定义类型.
- 网站统计中的数据收集原理及实现(share)
转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工 ...
- Servlet---RequestDispatcher.include方法
为了实现代码重用,需要将某些代码和数据放在一个或多个Servlet中,以供其他Servlet使用,提供了RequestDispatcher.include方法,首先通过getServletContex ...
- Swift—泛型(上)
1.泛型 泛型是一种非常灵活的语法,允许程序在函数.枚举.结构体.类中定义类型形参,这种类型形参实际代表的类型是动态改变的——程序可以等到真正使用这些函数.枚举.结构体.类时才为这些类型形参传入实际的 ...
- winfrom 限制文本框小数点后两位
private void numWeight_KeyPress(object sender, KeyPressEventArgs e) { if (char.IsNumber(e.KeyChar) | ...
- JAVA的单例模式与延时加载
延迟加载(lazy load)是(也称为懒加载),也叫延迟实例化,延迟初始化等,主要表达的思想就是:把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建.延迟加载机制是为了避免一些无谓的性能开 ...
- NOIP2016の遊記
看了cydiater的游记,我更加认识到我有多弱,大神有多强 剩余的时间不多了,NOIP前停的一周课又颓了相当多的时间,感觉NOIP真的药丸 最后一天复习模板,看一下错误,总结做题的经验,现在实力实在 ...
- 依赖注入 – ASP.NET MVC 4 系列
从 ASP.NET MVC 3.0 开始就引入了一个新概念:依赖解析器(dependence resolver).极大的增强了应用程序参与依赖注入的能力,更好的在 MVC 使用的服务和创 ...
- 基站查询接口,基站查询API
查询接口为商用,用于软件开发,非开发用户用不上.(说明:接口不能进行手机定位) 如需申请key,请联系QQ 2258172309. 1.移动联通基站查询接口 请求示例:http://www.cellm ...
- Imagenet tools install on windows
1.find the pyrcc4.exe path: C:\Anaconda2\Library\bin 2.cmd: pyrcc4 -o resources.py resources.qrc 3.a ...