转载请说明出处: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++11 中的阻塞队列是指在多线程环境下,实现生产者消费者模式的队列。阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_...
C++中,虽然标准库没有内置阻塞队列,但可以利用互斥锁(mutex)、条件变量(condition variable)等同步原语自定义实现。 ### 泛型 泛型是现代编程语言中的一个重要特性,允许在不指定具体类型的情况下编写代码,...
std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class> class lock_guard; lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard...
在C++11中,无锁队列的实现主要依赖于新标准引入的多线程支持、原子操作和内存模型。 首先,我们来看C++11的多线程支持。`<thread>`头文件提供了`std::thread`类,使得我们可以创建和管理线程。`std::this_thread`...
C++数据结构与算法之双缓存队列实现方法详解 本文主要介绍了C++数据结构与算法之双缓存队列实现方法,结合实例形式分析了双缓存队列的原理、实现方法与相关注意事项。 知识点一:双缓存队列的定义 双缓存队列是一...
c_c++阻塞队列的代码
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...
在IT领域,尤其是在多线程编程中,异步消息队列是一种常见的设计模式,用于实现高效、非阻塞的消息通信。本项目名为"C++ 跨平台 异步消息队列",显然它提供了一个用C++编写的跨平台解决方案,用于在不同线程间安全地...
阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列...
它可能包含了上述某一种或多种队列的实现,例如用C++、Java或其他编程语言实现的简单队列、阻塞队列、并发队列等。具体的实现细节需要查看源代码才能得知。 在实际应用中,队列常被用于任务调度、消息传递、网络...
基于c++11的轻量级Web并发服务器,使用Epoll与Reactor高并发模型,基于小根堆实现了定时器,利用单例模式与阻塞队列实现异步的日志系统.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松...
总结来说,C++消息队列是一个用于异步通信的关键组件,它基于自定义的C++类实现,具有良好的测试记录和实际应用经验。通过理解和使用这样的库,开发者可以构建更高效、更可靠的多线程和分布式系统。
在这个场景中,我们将深入探讨如何在C++中基于CAS实现一个无锁队列,并分析其背后的并发原理。 ### 一、CAS(Compare and Swap)操作 CAS是一种无锁算法的基础,它包含三个操作数:内存位置(V)、旧值(A)和新值...
《基于C++11的轻量级网络框架与线程池技术实现大并发网络IO解析》 在现代软件开发中,高性能的网络编程是至关重要的,尤其在处理高并发请求时。本文将深入探讨一个基于C++11的轻量级网络框架,该框架充分利用了...
本项目采用C++的muduo网络库作为基础,通过Nginx实现负载均衡,并利用Redis消息队列实现跨服务器通信,从而构建出一个高效、稳定且易于扩展的集群聊天服务器。 muduo网络库是C++中的一个高性能网络库,特别适用于...
C++开发基于TCPsocket实现的web服务器源码。基于TCP socket实现的支持报文解析并返回响应报文的Web服务器,可以响应多种文件需求并能够处理特定的错误情况 服务器实现及其功能: 1、读取配置文件,为服务器自身设置...
在这个例子中,我们看到如何在Linux环境下使用C++和POSIX线程库(pthread)中的条件变量(condition variables)来实现阻塞队列。 首先,我们需要包含必要的头文件,并定义一个名为`BlockingQueue`的类。这个类包含了...
需要指定消息队列标识符、消息结构体指针、消息的长度以及控制标志,如是否阻塞等。 在描述中提到的`msgsend`函数,可能是一个自定义的函数,用来封装`msgsnd()`函数的调用。当用户输入'end'时,程序会结束,这可能...
在C++11及以后的版本中,C++引入了`<thread>`库,提供了创建和管理线程的功能。通过`std::thread`类,我们可以创建新的线程来执行特定的任务。 2. **互斥量(Mutex)** 互斥量是同步机制的一种,用于确保同一时间...