C++ 队列的实现

 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 = 0;
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(1);            //释放信号 让正在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(1);                //发出信号 让Pop可以操作了
53         return true;
54     }
55     inline Type* Pop()
56     {
57         semaphore.Wait(INFINITE);            //等待Push的信号发来后才进行动作
58         if(bInit == false)
59             return 0;
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
72 private:
73     bool bInit;
74     int     count;
75     Semaphore    semaphore;
76     CriticalSection criticalsection;
77     std::list<Type*> queueList;
78 };

其中用到了简单包装的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
32 //信号量
33 class Semaphore
34 {
35 public:
36     inline Semaphore()
37     {
38         m_hSem = NULL;
39     }
40     inline ~Semaphore()
41     {
42         Close();
43     }
44     inline BOOL Create(LONG lMaximumCount)
45     {
46         m_hSem = CreateSemaphore(NULL, 0, lMaximumCount, NULL);
47         return (m_hSem != NULL);
48     }
49     inline void Close()
50     {
51         if (m_hSem)
52         {
53             CloseHandle(m_hSem);
54             m_hSem = NULL;
55         }
56     }
57     inline BOOL Release(LONG lReleaseCount)
58     {
59         return ReleaseSemaphore(m_hSem, lReleaseCount, NULL);
60     }
61     inline DWORD Wait(DWORD dwMilliseconds)
62     {
63         return WaitForSingleObject(m_hSem, dwMilliseconds);
64     }
65
66 public:
67     HANDLE  m_hSem;
68 };
时间: 2024-10-19 06:34:32

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

redis 学习 四 队列

<?php /** * redis实战 * * 利用列表list实现简单队列 * * @example php cache.php */ header('content-type:text/html;chaeset=utf-8'); $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); // 进队列 $userId = mt_rand(000000, 999999); $redis->rpush('QUEUE_NAME',j

构建队列,数组版本

队列作为基本的数据结构,是每个coder所必须掌握的. 队列在逻辑上就像是一条打饭的长队,排在前面的先打到饭(先进先出). 这里用一个数组用以构造一个队列,并设置两个指向,head指向队首,tail指向队尾,初始状态是head与tail指向同一位置(队列为空) 队列有两个操作:入队与出队. 1.入队:对比打饭排队的场景,新来的人排在后面,这是队尾tail需向后移一位. 2.出队:已经打好饭的人就可以出去了,这时队头也需向后移一位,让后面的人成为队头. 注意: 当head与tail都移到数组末端,

链队列代码及应用

链队列代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int ElemType; typedef struct Qnode{ int

caffe数据读取的双阻塞队列说明

caffe的datareader类中 class QueuePair { public: explicit QueuePair(int size); ~QueuePair(); BlockingQueue<T*> free_; BlockingQueue<T*> full_; DISABLE_COPY_AND_ASSIGN(QueuePair); }; 这个就是双阻塞队列,先将free队列填充到最大长度,然后按照如下规则: 1,每当生产者push时,先将full队列pop,如果fu

线性结构的常见应用之一 队列

定义:一种可以实现"先进先出"的存储结构 分类 链式队列 --  用链表实现 静态队列 --  用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列 2.循环队列需要几个参数来确定   需要两个参数来进行确定:front   rear 3.循环队列各个参数的含义 2个参数在不同的场合有不同的含义 建议初学者先记住,后面再想 1).队列初始化 front 和 rear 的值都是零 2).队列非空 front 代表的是队列的第一个元素 rear 代表

阻塞队列和生产者-消费者模式

阻塞队列提供了可阻塞的put和take方法.如果队列满了put将阻塞到有空间可用,如果队列为空,take将阻塞到有元素可用.队列可以是有界和无界的,无界的队列put将不会阻塞. 阻塞队列支持生产者消费者模式,该模式将找出需要完成的工作,和执行工作分开.生产者-消费者模式能简化开发过程,因为消除了生产者和消费者之间的代码依赖性,此外,该模式还将生产数据的过程和使用数据的过程解耦开来. 在基于阻塞队列构建的生产者-消费者设计中个,当数据生成时,生产者把数据放入队列,当消费者处理数据时,将从队列中获取

MQ队列管理器搭建(一)

多应用单MQ使用场景 如上图所示,MQ独立安装,或者与其中一个应用同处一机.Application1与Application2要进行通信,但因为跨系统,所以引入中间件来实现需求. Application1需要连接MQ,并将消息放入队列Queue中,Application2同样连接MQ,监听在Queue队列上,一旦发现有消息进入则取出该消息进行处理. 下面将给出创建队列管理器和队列的示例: 定义队列管理器名称为Qm1,本地队列名称为Queue,服务器连接通道CHAN_SERVER_CON,监听端口

PHP电商订单自动确认收货redis队列

一.场景 之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货.所谓的订单自动确认收货,就是在在特定的时间,执行一条update语句,改变订单的状态. 二.思路 最笨重的做法,通过linux后台定时任务,查询符合条件的订单,然后update.最理想情况下,如果每分钟都有需要update的订单,这种方式也还行.奈何平台太小,以及卖家发货时间大部分也是密集的,不会分散在24小时的每分钟.那么,

快速入门系列--WCF--06并发限流、可靠会话和队列服务

这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的事务知识做一定补充. 对于WCF服务来说,其寄宿在一个资源有限的环境中,为了实现服务性能最大化,需要提高其吞吐量即服务的并发性.然而在不进行流量控制的情况下,并发量过多,会使整个服务由于资源耗尽而崩溃.因此为相对平衡的并发数和系统可用性,需要设计一个闸门(Throttling)控制并发的数量. 由于

Python3-queue模块-同步队列

Python3中的queue模块实现多生产者,多消费者队列,特别适用于多个线程间的信息的安全交换,主要有三个类 queue.Queue(maxsize=0) 构造一个FIFO(先进先出)的队列 queue.LifoQueue(maxsize=0) 构造一个LIFO(后进先出)的队列 queue.PriorityQueue(maxsize=0) 构造一个具有优先级的队列,存储的是一个元组(n, value),n为数字代表优先级,数字越小,级别越高 这个模块定义了两个异常 queue.Empty 如