`
aigo
  • 浏览: 2569056 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

基于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++中,虽然标准库没有内置阻塞队列,但可以利用互斥锁(mutex)、条件变量(condition variable)等同步原语自定义实现。 ### 泛型 泛型是现代编程语言中的一个重要特性,允许在不指定具体类型的情况下编写代码,...

    c++11 实现的阻塞队列

    C++11 实现的阻塞队列 C++11 中的阻塞队列是指在多线程环境下,实现生产者消费者模式的队列。阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_...

    C++基于消息队列的多线程实现示例代码

    std::lock_gurad 是 C++11 中定义的模板类。定义如下: template &lt;class&gt; class lock_guard; lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard...

    c++11无锁队列的一种简单实现.pptx

    在C++11中,无锁队列的实现主要依赖于新标准引入的多线程支持、原子操作和内存模型。 首先,我们来看C++11的多线程支持。`&lt;thread&gt;`头文件提供了`std::thread`类,使得我们可以创建和管理线程。`std::this_thread`...

    C++数据结构与算法之双缓存队列实现方法详解

    C++数据结构与算法之双缓存队列实现方法详解 本文主要介绍了C++数据结构与算法之双缓存队列实现方法,结合实例形式分析了双缓存队列的原理、实现方法与相关注意事项。 知识点一:双缓存队列的定义 双缓存队列是一...

    c_c++阻塞队列的代码

    c_c++阻塞队列的代码

    基于c++11的轻量级Web并发服务器,基于小根堆实现了定时器,利用单例模式与阻塞队列实现异步的日志系统.zip

    C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...

    C++ 跨平台 异步消息队列

    在IT领域,尤其是在多线程编程中,异步消息队列是一种常见的设计模式,用于实现高效、非阻塞的消息通信。本项目名为"C++ 跨平台 异步消息队列",显然它提供了一个用C++编写的跨平台解决方案,用于在不同线程间安全地...

    利用C++如何实现一个阻塞队列详解

    阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列...

    高效的实现队列

    它可能包含了上述某一种或多种队列的实现,例如用C++、Java或其他编程语言实现的简单队列、阻塞队列、并发队列等。具体的实现细节需要查看源代码才能得知。 在实际应用中,队列常被用于任务调度、消息传递、网络...

    基于小根堆实现定时器,利用单例模式与阻塞队列实现异步的日志系统

    基于c++11的轻量级Web并发服务器,使用Epoll与Reactor高并发模型,基于小根堆实现了定时器,利用单例模式与阻塞队列实现异步的日志系统.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松...

    C++消息队列

    总结来说,C++消息队列是一个用于异步通信的关键组件,它基于自定义的C++类实现,具有良好的测试记录和实际应用经验。通过理解和使用这样的库,开发者可以构建更高效、更可靠的多线程和分布式系统。

    基于cas的无锁队列实现

    在这个场景中,我们将深入探讨如何在C++中基于CAS实现一个无锁队列,并分析其背后的并发原理。 ### 一、CAS(Compare and Swap)操作 CAS是一种无锁算法的基础,它包含三个操作数:内存位置(V)、旧值(A)和新值...

    一个基于C++11的轻量级网络框架,基于线程池技术可以实现大并发网络IO.zip

    《基于C++11的轻量级网络框架与线程池技术实现大并发网络IO解析》 在现代软件开发中,高性能的网络编程是至关重要的,尤其在处理高并发请求时。本文将深入探讨一个基于C++11的轻量级网络框架,该框架充分利用了...

    C++开发基于TCPsocket实现的web服务器源码.zip

    C++开发基于TCPsocket实现的web服务器源码。基于TCP socket实现的支持报文解析并返回响应报文的Web服务器,可以响应多种文件需求并能够处理特定的错误情况 服务器实现及其功能: 1、读取配置文件,为服务器自身设置...

    Linux C++ 使用condition实现阻塞队列的方法

    在这个例子中,我们看到如何在Linux环境下使用C++和POSIX线程库(pthread)中的条件变量(condition variables)来实现阻塞队列。 首先,我们需要包含必要的头文件,并定义一个名为`BlockingQueue`的类。这个类包含了...

    利用消息队列实现进程间通信

    需要指定消息队列标识符、消息结构体指针、消息的长度以及控制标志,如是否阻塞等。 在描述中提到的`msgsend`函数,可能是一个自定义的函数,用来封装`msgsnd()`函数的调用。当用户输入'end'时,程序会结束,这可能...

    httplib库实现非阻塞式监听

    在"httplib实现非阻塞式监听-服务器"的压缩包文件中,可能包含了实现上述功能的示例代码、配置文件或测试脚本。通过研究这些文件,你可以更深入地理解如何在实际项目中运用`httplib`库构建高效的非阻塞式HTTP服务器...

    C++实现生产与消费者模型

    在C++11及以后的版本中,C++引入了`&lt;thread&gt;`库,提供了创建和管理线程的功能。通过`std::thread`类,我们可以创建新的线程来执行特定的任务。 2. **互斥量(Mutex)** 互斥量是同步机制的一种,用于确保同一时间...

Global site tag (gtag.js) - Google Analytics