c++消息队列的实现
来源:互联网 发布:软件编程有哪些大学 编辑:程序博客网 时间:2024/06/09 20:54
(1)消息队列的实现
#ifndef NET_FRAME_CONCURRENT_QUEUE_H#define NET_FRAME_CONCURRENT_QUEUE_H#include <queue>#include <mutex>#include <condition_variable> template<class Type>/*消息队列实现*/ class ConcurrentQueue { ConcurrentQueue& operator=(const ConcurrentQueue&) = delete; ConcurrentQueue(const ConcurrentQueue& other) = delete; public: ConcurrentQueue() : _queue(), _mutex(), _condition() { } virtual ~ConcurrentQueue() { } void Push(Type record) { std::lock_guard <std::mutex> lock(_mutex); _queue.push(record); _condition.notify_one(); } bool Pop(Type& record, bool isBlocked = true) { if (isBlocked) { std::unique_lock <std::mutex> lock(_mutex); while (_queue.empty()) { _condition.wait(lock); } } else // If user wants to retrieve data in non-blocking mode { std::lock_guard <std::mutex> lock(_mutex); if (_queue.empty()) { return false; } } record = std::move(_queue.front()); _queue.pop(); return true; } int32_t Size() { std::lock_guard <std::mutex> lock(_mutex); return _queue.size(); } bool Empty() { std::lock_guard <std::mutex> lock(_mutex); return _queue.empty(); } private: std::queue <Type> _queue; mutable std::mutex _mutex; std::condition_variable _condition; };#endif //NET_FRAME_CONCURRENT_QUEUE_H
(2)拥有消息队列的线程池的实现
.h文件如下
#ifndef NET_FRAME_THREAD_POOL_H#define NET_FRAME_THREAD_POOL_H#include "ConcurrentQueue.h"#include <vector>#include <queue>#include <memory>#include <thread>#include <mutex>#include <condition_variable>#include <future>#include <functional>#include <stdexcept>#define MIN_THREADS 10 template<class Type> class ThreadPool { ThreadPool& operator=(const ThreadPool&) = delete; ThreadPool(const ThreadPool& other) = delete; public: ThreadPool(int32_t threads, std::function<void(Type& record)> handler); virtual ~ThreadPool(); void Submit(Type record); private: private: bool _shutdown; int32_t _threads; std::function<void(Type& record)> _handler; std::vector <std::thread> _workers; ConcurrentQueue <Type> _tasks; }; template<class Type> ThreadPool<Type>::ThreadPool(int32_t threads, std::function<void(Type &record)> handler) : _shutdown(false), _threads(threads), _handler(handler), _workers(), _tasks() { if (_threads < MIN_THREADS) _threads = MIN_THREADS; for (int32_t i = 0; i < _threads; ++i) _workers.emplace_back( [this] { while (!_shutdown) { Type record; _tasks.Pop(record, true); _handler(record); } } ); } template<class Type> ThreadPool<Type>::~ThreadPool() { for (std::thread &worker: _workers) worker.join(); } template<class Type> void ThreadPool<Type>::Submit(Type record) { _tasks.Push(record); }#endif //NET_FRAME_THREAD_POOL_H
0 0
- C实现消息队列Queue
- C 消息队列实现通信
- 消息队列的实现
- 环形消息队列的实现
- 消息的循环队列实现
- 消息队列的简单实现
- c++消息队列的实现
- redis消息队列的实现
- Linux 消息队列的实现
- c实现自定义消息队列实例源码
- 【C++】队列的实现
- 【C语言】【unix c】两个进程通过消息队列实现进程间的通信
- 基于消息队列的C/S通信
- linux c 消息队列的使用
- 基于消息队列的C/S通信
- 实现基于VxWorks的消息队列通信机制的C/S通信
- 一个消息队列类的实现C++
- 消息队列的设计与实现
- web学习之博客小项目(分页显示文章)
- 高性能nginx教程
- Java中的两种单例模式--饿汉式和懒汉式
- Mybatis3.1.1中 if 或者 when如果按照下面的写法是不会通过的。
- SoCFPGA设计资源链接(持续更新)
- c++消息队列的实现
- 程序员之路后起者
- 游戏开发中的层次
- SAP权限设定
- Linux-----系统安装【二】【开启网卡】
- 国外程序员整理的 PHP 资源大全
- Xcode找回欢迎界面显示
- 互斥和临界区的区别
- 清华-数据结构-祖玛