用STL设计消息队列、优先级消息队列、资源分配管理器

C++ 知识补充 向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。 阅读详情

          STL库老早已经成为C++的一部分,在使用C++开发项目的过程中,很多人还在犹豫要不要使用STL库,觉得STL库很难,其实不然。我工作的项目中现在大量使用STL库,STL使用调试简单,高效,可以减少很多重复的代码。

       本文的主要目的是使用STL的queue 和 priority queue来阐述下项目中经常使用的消息队列以及资源分配模式。本文的例子主要如下:

  • 消息队列
  • 带优先级的消息队列
  • 资源分配管理器

    STL容器

    我们将使用下面的容器来实现本文的例子:

    queue队列容器支持添加一个元素,并且从中删除一个元素,也可以变成一个双端队列
    priority_queue向队尾添加一个新元素,如果该优先权大于前面的元素,将放在前面,元素的优先权由用户指定的函数传入。
    stack有后进先出的特点,可以选择选择vetctor或其他线性列表放入容器。

        

     

    1.消息队列

        消息队列是项目中经常需要使用的模式,下面使用STL的queue容器实现:

      

    #include <queue>     // STL header file for queue
    #include <list>
    using namespace std; // Specify that we are using the std namespace
    
    class Message;
    
    class Message_Queue
    {
       typedef queue<Message *, list<Message *> > MsgQueType;
    
       MsgQueType m_msgQueue;
          
    public:
       void Add(Message *pMsg)
       {
          // Insert the element at the end of the queue
          m_msgQueue.push(pMsg);
       }
    
       Message *Remove()
       {
          Message *pMsg = NULL;
          
          // Check if the message queue is not empty
          if (!m_msgQueue.empty())
          {
             // Queue is not empty so get a pointer to the
             // first message in the queue
             pMsg = m_msgQueue.front();
             
             // Now remove the pointer from the message queue
             m_msgQueue.pop();
          }
          return pMsg;
       }
       
       int GetLength() const
       {
          return m_msgQueue.size();
       }   
    };
    


     

    2.优先级消息队列

          上面的消息队列类只支持在队列的尾部添加一个元素,在许多的应用程序中,需要根据消息的优先级将消息添加到队列中,当一个高优先级的消息来了,需要将该消息添加到所有比它优先级低的消息前面,下面将使用priority_queue来实现优先级消息队列类。

        

    函数对象(Functors)

    优先级消息队列的实现和上面消息队列实现相似,唯一不同的是这里使用了函数对象来决定优先权CompareMessages,该结构重载了操作符"(,)",该机制可以实现可以将一个函数作为一个参数,和函数指针对比有如下好处:

           1.函数对象效率更高,可以是内联函数,函数指针总是有函数调用的开销。

            2.函数对象提供了一个安全的实现方法,这样的实现不会出现空指针访问。

    #include <queue>      // STL header file for queue
    #include <list>
    using namespace std;  // Specify that we are using the std namespace
    
    class Message;
    
    class Priority_Message_Queue
    {
        struct Entry
        {
            Message *pMsg;
            int priority;
        };
       
        struct Compare_Messages
        {
            bool operator () (const Entry& left , const Entry& right)
            {
                return (left.priority < right.priority);
            }
        };  
     
       typedef priority_queue<Entry, vector<Entry>, Compare_Messages  > 
                 Message_Queue_Type;
    
       Message_Queue_Type m_message_Queue;
          
    public:
    
       void Add(Message *pMsg, int priority)
       {
          // Make an entry
          Entry entry;
          entry.pMsg = pMsg;
          entry.priority = priority;
          // Insert the element according to its priority
          m_message_Queue.push(entry);
       }
       
       Message *Remove()
       {
          Message *pMsg = NULL;
          
          // Check if the message queue is not empty
          if (!m_message_Queue.empty())
          {
             // Queue is not empty so get a pointer to the
             // first message in the queue
             pMsg = (m_message_Queue.top()).pMsg;
             
             // Now remove the pointer from the message queue
             m_message_Queue.pop();
          }
          return (pMsg);
       }
       
       size_t Get_Length() const
       {
          return m_message_Queue.size();
       }   
    };
    


         

    3.资源分配管理器

    这里使用queue 和 stack两个容器来实现一个简单的资源分配器,用该容器来保存空闲的资源列表。

    该资源分配器支持如下接口:

           1.Construction:当这个资源分配器构造出来,需要给定空闲的资源列表,这些资源将添加到这个空闲资源列表。

           2.Allocate:当需要一个资源时,需要从空闲资源队列中移除一个资源,并返回给调用者。

          3.Free:当一个资源被释放,需要将该资源加入空闲资源列表。

          4.GetFreeResourceCount:返回当前可用的资源数目。

    Coldest First(使用queue)

    #include <queue>      // STL header file for queue
    #include <list>
    using namespace std;  // Specify that we are using the std namespace
    
    class Resource;
    
    class Cold_Resource_Allocator
    {
       typedef queue<Resource *, list<Resource *> > Free_Queue_Type;
    
       Free_Queue_Type m_free_Resource_Queue;
          
    public:
       
       Cold_Resource_Allocator(int resource_Count, 
                                 Resource *resource_Array[])
       {
          for (int i = 0; i < resource_Count; i++)
          {
             m_free_Resource_Queue.push(resource_Array[i]);
          }
       }
     
       Resource * Allocate()
       {
          Resource *pResource = NULL;
          
          // Check if any free resources are available.
          if (!m_free_Resource_Queue.empty())
          {
             // Queue is not empty so get a pointer to the
             // first resource in the queue
             pResource = m_free_Resource_Queue.front();
             
             // Now remove the pointer from the free resource queue
             m_free_Resource_Queue.pop();
          }
          return pResource;
       }
       
       void Free(Resource *pResource)
       {
          // Insert the resource at the end of the free queue
          m_free_Resource_Queue.push(pResource);
       }
          
       size_t GetFreeResourceCount()
       {
          return m_free_Resource_Queue.size();
       }   
    };
    


     

    Hottest First(使用statck)

    #include <stack>     // STL header file for stack
    #include <deque>
    using namespace std; // Specify that we are using the std namespace
    
    class Resource;
    
    class Hot_Resource_Allocator
    {
    
       typedef stack <Resource *, deque <Resource *> > 
                 Free_Stack_Type;
    
       Free_Stack_Type m_free_Resource_Stack;
          
    public:
       
       Hot_Resource_Allocator(int resource_Count, 
                                Resource *resource_Array[])
       {
          for (int i = 0; i < resource_Count; i++)
          {
             m_free_Resource_Stack.push(resource_Array[i]);
          }
       }
    
       Resource * Allocate()
       {
          Resource *pResource = NULL;
          
          // Check if any free resources are available.
          if (!m_free_Resource_Stack.empty())
          {
             // Queue is not empty so get a pointer to the
             // first resource in the stack
             pResource = m_free_Resource_Stack.top();
             
             // Now remove the pointer from the free resource stack
             m_free_Resource_Stack.pop();
          }
          return pResource;
       }
       
       void Free(Resource *pResource)
       {
          // Insert the resource at the end of the free stack
          m_free_Resource_Stack.push(pResource);
       }
          
       size_t GetFreeResourceCount()
       {
          return m_free_Resource_Stack.size();
       }   
    };
    


     

     

     

奇安信终端开发笔试题解析:从C/C++基础到安全对抗 在安全厂商的终端开发岗位中,笔试考察的不仅是编码能力,更是对系统底层原理与安全对抗思维的深层理解。以C/C++为根基,指针与内存管理决定代码的健壮性,RAII与智能指针体现工程化素养;操作系统层面,进程线程调度、虚拟内存与Linux系统编程构建起系统级软件的运行逻辑;网络协议栈的TCP状态机与TLS握手则支撑起安全检测与流量分析场景。从通用的内存管理、并发控制到协议分析,这些基础技术最终都指向终端安全产品的真实需求——监控恶意行为、检测漏洞利用、实现可靠隔离。掌握这些核心知识,并理解攻击者视角下的系统滥用方 阅读详情

相关推荐

C# C++ 笔记

变量自定义赋值​# 变量取值用$()​​​​​​clean:多个程序员分发同一程序时,由于不能直接在一个程序上进行功能的开发,所以就有了功能分支的概念。二维数组可以理解为是存储指针的一维数组,里面的每一个指针都指向一个一维数组的首地址存储多个一维数组的数据结构。array 是一个二维数组,它有3行和4列,总共可以存储12个整数。

AVICCI的博客 2201

【12】优先级队列的介绍和实现

优先级队列的介绍和实现,基于数组和堆实现优先级队列

zjj_flower的博客 351

【C++服务器入门基础------5.IPC进程间通信--消息队列】

c++服务器入门系列 大学生寒假在家里过于无聊,整理一下以前学过的知识,顺便复习一下,水平较低,专业性不强,仅供参考。

qq_39583373的博客 1469

C++ 实现一个消息队列

消息队列在多线程的场景有时会用到,尤其是线程通信跨线程调用的时候,就可以使用消息队列进行通信。C++实现一个能用的消息队列还是比较简单的,只需要一个队列一个互斥变量和一个条件变量,这些在标准库中都有提供。基于曾经写过的项目,总结出来最简单的消息队列的实现将在下文中介绍。

codeofcc的博客 1万+

使用C++ STL容器Queue进行队列编程

使用C++ STL容器Queue进行队列编程队列(Queue)是一种常用的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在C++中,STL(Standard Template Library)提供了一个名为Queue的容器,可以方便地实现队列的操作。本文将介绍如何使用C++ STL容器Queue进行队列编程,并提供相应的源代码。接下来,我们可以创建一个Queue对象,并进行一系列的操作。

TechInk的博客 179

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01

算法设计

weixin_49199313的博客 1499

C++简单实现消息队列

消息队列是一种应用间的通讯方式,消息发送后可以立即放回,由消息系统来确保消息的可靠传递。消息发布者只需要将消息发布到消息队列中,而不需要管谁来取。消息使用者只管从消息队列中取消息而不管谁发布的。这样发布者和使用者都不同知道对方的存在。消息队列普遍使用在生产者和消费者模型中。下面使用C++实现一个简单的消息队列。

weixin_57023347的博客 1636

2026年经纬恒润嵌入式岗位面试题带答案

嵌入式开发核心知识总结(150字摘要) 本文系统梳理了嵌入式开发38道高频面试题,涵盖八大核心模块:1)MCU架构与底层外设(11题)重点考察Cortex-M/Tricore内核特性、启动流程、寄存器操作及外设驱动开发;2)硬件设计基础(2题)涉及原理图与驱动电路设计;3)C语言核心(9题)聚焦指针、内存管理、编译原理等底层机制;4)RTOS(3题)考查任务调度与通信;5)通信协议(5题)包括I2C、CAN、TCP/IP等;6)控制算法(3题)覆盖PID、FOC等;7)C++/数据结构(4题)侧重面向对象与

Open 68

C++消息队列,多线程

本文提供了一种C++消息队列的实现方式(包括一个线程类和一个消息队列类),通过一个简单示例说明如何生产消息和消费消息。

南_无_生的博客 2303

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1267

【信息科学与工程学】【数据科学】数据科学领域 第十二篇 大数据主要算法07 任务工序(2)

工序类别工序名称工序描述处理时序输入输出控制点质量指标异常处理数据接入工序​流数据源连接连接到外部流数据源初始阶段流数据源配置流数据连接连接参数配置连接成功率重连机制,失败告警数据拉取从数据源拉取数据持续实时数据源连接原始数据流拉取频率,批大小数据延迟,吞吐量超时重试,流量控制反序列化将二进制数据反序列化数据到达时二进制数据结构化数据记录序列化格式反序列化成功率格式异常处理数据预处理工序​数据验证验证数据完整性和格式反序列化后原始数据记录验证后数据验证规则数据质量合格率丢弃无效数据,异常记录数据清洗清洗脏数

weixin_49199313的博客 779

【信息科学与工程学】【数据中心】第三十二篇 云数据中心的计算/存储/网络的核心挑战01

状态方程: SOCk+1​=SOCk​−Qn​ik​Δt​;: 三相电流变换到αβ坐标系: iα​=32​​(ia​−21​ib​−21​ic​), iβ​=32​​(23​​ib​−23​​ic​). 计算瞬时有功功率p和无功功率q,经低通滤波器分离直流分量,反变换得基波电流,差值即为谐波指令。: 节点i的信念 bi​(xi​)=ϕi​(xi​)∏j∈N(i)​mji​(xi​), 消息 mij​(xj​)=∑xi​​ϕi​(xi​)ψij​(xi​,xj​)∏k∈N(i)\j​mki​(xi​).

weixin_49199313的博客 217

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 11 算法篇

在百万级虚拟机、百万级租户的超大规模云环境中,核心算法挑战包括:挑战维度具体问题算法需求技术复杂度规模性​百万级对象并发管理分布式算法、分区算法极高(NP-hard问题)多租户​租户间隔离与资源共享公平性算法、隔离算法高(多目标优化)动态性​资源需求实时变化自适应算法、在线算法高(实时决策)异构性​硬件/负载/需求差异分类算法、匹配算法中高(多维度优化)经济性​资源利用率与成本平衡优化算法、博弈论算法高(多目标博弈)以下是按领域分类的详细算法列表:算法名称数学建模表达核心思想时间复杂度适用场景推理步骤首次适

weixin_49199313的博客 1394

C++ 消息队列

需要注意的是,这个实现是基本的,并且可能不适合所有用例。例如,它并没有处理生产者或消费者过多的情况,这可能导致队列的大小无限增长。在实际应用中,你可能需要添加一些额外的逻辑来处理这种情况,例如限制队列的大小,或者在队列满时阻塞生产者。在C++中,并没有直接提供消息队列(Message Queue)的标准库实现。等工具自己实现一个简单的线程安全消息队列。这个实现允许你在多线程环境中安全地推送和弹出消息。方法,该方法尝试从队列中弹出消息,如果队列为空,则返回。操作,以及在有新消息时通知等待的线程。

wy749929317的博客 1500

【信息科学与工程学】【运营科学】第二篇 C4信息与通信网络运营 (C4) ——数据中心网络运营04

典型值:λ1​∈[−0.02,−0.01], λ2​∈[−0.01,0], η1​,η3​∈[0.1,0.3], η2​,η4​∈[0.05,0.15]参数:δ1​∈[−0.8,−0.3], δ2​∈[−0.5,−0.2], δ3​∈[−0.4,−0.1], δ4​∈[−0.6,−0.2]参数:φ1​∈[0.1,0.3], φ2​∈[−0.2,−0.05], φ3​∈[−0.1,0.1], φ4​∈[−0.3,−0.1]参数:α∈[0.3,0.6], β∈[0.2,0.4], γ∈[0.01,0.03]

weixin_49199313的博客 1204

【信息科学与工程学】【数据科学】数据科学领域——第一篇 数据科学领域算法体系

数据湖和数据仓库在代码实现上的核心差异源于它们不同的设计哲学和目标场景。数据湖代码更注重灵活性和原始数据保存,而数据仓库代码更强调结构化和性能优化。现代数据架构通常采用湖仓一体模式,结合两者的优势,通过统一的API和元数据层提供最佳体验。

weixin_49199313的博客 868

c++ 消息队列

消息队列实现的基本原理,其实还是最基础的锁、和信号量以及deque,其中deque用于存放消息内容,锁、和信号量做线程间同步;消息队列有两种通信机制,一对多,或一对一消息队列可满足一个线程发送消息(发送时需要表明发给哪个线程),多个线程接收消息(多个线程之间为抢占模式),如确认消息是发给自己的则做相应的处理;一对一时不需要线程有自己的名字消息队列具备阻塞和非阻塞两种模式。...

hanhailong0525的博客 3718

【信息科学与工程学】【安全领域】第一百四十二篇 零信任网络解决方案中的算法04

对于节点 i, 有功和无功功率平衡方程为: Pi​=Vi​∑j=1N​Vj​(Gij​cosθij​+Bij​sinθij​), Qi​=Vi​∑j=1N​Vj​(Gij​sinθij​−Bij​cosθij​)。下风向某点 (x,y,z)的浓度 C为: C=2πuσy​σz​Q​exp(−2σy2​y2​)[exp(−2σz2​(z−H)2​)+exp(−2σz2​(z+H)2​)], 其中 Q是源强, u是风速, H是有效源高, σy​,σz​是水平和垂直扩散参数。

weixin_49199313的博客 1409
上一篇: 批处理FINDSTR正则表达式用法实例
下一篇: VS2008编译器下ACE的配置
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值