基于C++11的阻塞队列简单实现
来源:互联网 发布:淘宝开放平台api 申请 编辑:程序博客网 时间:2024/06/01 10:45
基于C++11的阻塞队列简单实现
转载请说明出处:http://blog.csdn.net/cywosp/article/details/9157379
在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)。下图展示如何通过阻塞队列来合作:
接下来我们用C++11来实现一个简单的阻塞队列(没有容量限制的BlockingQueue)
template<typename T>class BlockingQueue{public: BlockingQueue () : _mutex (), _condvar (), _queue () { } void Put (const T& task) { { std::lock_guard<std::mutex> lock (_mutex); _queue.push_back (task); } _condvar.notify_all (); } T Take () { std::unique_lock<std::mutex> lock (_mutex); _condvar.wait (lock, [this]{return !_queue.empty ();}); assert (!_queue.empty ()); T front (_queue.front ()); _queue.pop_front (); return front; } size_t Size() const { std::lock_guard<std::mutex> lock (_mutex); return _queue.size(); }private: BlockingQueue (const BlockingQueue& rhs); BlockingQueue& operator = (const BlockingQueue& rhs);private: mutable std::mutex _mutex; std::condition_variable _condvar; std::list<T> _queue;};
注:以上代码需要加入下列头文件
#include <condition_variable>
#include <list>
#include <assert.h>
编译时需要加入编译选项 -std=c++0x或者-std=c++11
简单测试程序如下:
将上述代码放到 BlockingQueue.hpp文件中
#include <iostream>#include <thread>#include <future>#include "BlockingQueue.hpp"int main (int argc, char* argv[]){ BlockingQueue<int> q; auto t1 = std::async (std::launch::async, [&q] () { for (int i = 0; i < 10; ++i) { q.Put (i); } }); auto t2 = std::async (std::launch::async, [&q] () { while (q.Size ()) { std::cout << q.Take () << std::endl; } }); auto t3 = std::async (std::launch::async, [&q] () { while (q.Size ()) { std::cout << q.Take () << std::endl; } }); t1.wait (); t2.wait (); t3.wait (); return 0;}
编译: g++ -o blockingqueue -std=c++11 main.cpp BlockingQueue.hpp -pthread
执行blockingqueue得如下结果:
10
23
4
5
6
7
8
9
本篇文章只是简单的实现了阻塞队列的插入函数与获取函数,在java中有线程的BlockingQueue容器可以直接使用,其提供了很多有用的函数(欲知请Google)。
- 基于C++11的阻塞队列简单实现
- 一个简单的阻塞队列实现
- c++ 多线程阻塞队列的简单实现
- Java:实现简单的阻塞队列
- 使用数组简单实现的阻塞队列
- 基于pthread的C++阻塞队列模板类的实现
- 基于LinkedBlockingQueue源码自我实现阻塞队列
- 基于阻塞队列实现消费者和生产者
- 基于阻塞队列实现消费者和生产者
- 简单队列的实现(基于数组)
- 基于js的简单队列实现
- 基于数组的队列实现(C语言)
- Java阻塞队列的实现
- Java阻塞队列的实现
- Java阻塞队列的实现
- Java阻塞队列的实现
- Java阻塞队列的实现
- c++ 阻塞队列的实现
- java 死锁产生原因及解锁
- WebService .net web服务
- 学会提问-- 批判性思维指南--读书笔记(以及转载李笑来的字里行间)
- 50个必备的实用jQuery代码段(2)
- FPGA 调试经验
- 基于C++11的阻塞队列简单实现
- 利用电脑宽带上网共享虚拟WIFI热点
- Java多线程之间的通信
- 13年上半年总结记
- The Star Zoo——2、A spaceship made of plastic
- 关于java中 UnsupportedOperationException
- Android开发重要参考资料
- Android原始资源的使用
- JavaScript 单例模式