21xrx.com
2024-11-22 07:10:20 Friday
登录
文章检索 我的文章 写文章
C++11 多生产者单消费者队列实现
2023-07-13 08:49:13 深夜i     --     --
C++11 多生产者 单消费者 队列实现

C++11是C++语言的一个版本,它引入了许多新特性,其中包括多线程的支持。多线程是指在一个应用程序中同时运行多个线程,每个线程执行不同的任务。这为程序员提供了以前无法想象的功能和性能。

在多线程编程中,队列(Queue)是非常重要的数据结构,它通常用于多线程之间的数据传输。在多生产者单消费者(Multiple Producers Single Consumer)的情况下,多个线程向队列中插入数据,一个线程从队列中取出数据。这种情况是很常见的,例如网络服务器处理客户端请求时,多个线程同时接收客户端数据并将其存入队列,一个线程负责从队列中取出数据并进行处理。

为了实现多生产者单消费者队列,我们可以使用C++11的标准库中的std::queue,结合互斥锁和条件变量来实现。互斥锁用于保护队列的访问,条件变量用于线程之间的通信。

以下是实现多生产者单消费者队列的代码:


#include <queue>

#include <mutex>

#include <condition_variable>

template<typename T>

class MpscQueue {

public:

  void push(const T& value) {

    std::lock_guard<std::mutex> lock(_mutex);

    _queue.push(value);

    _condition_variable.notify_one();

  }

  T pop() {

    std::unique_lock<std::mutex> lock(_mutex);

    _condition_variable.wait(lock, [this] { return !_queue.empty(); });

    T value = _queue.front();

    _queue.pop();

    return value;

  }

private:

  std::queue<T> _queue;

  std::mutex _mutex;

  std::condition_variable _condition_variable;

};

上述代码中,MpscQueue是一个模板类,用于存储任意类型的数据。它包含两个方法:push和pop。push方法用于将数据插入队列中,pop方法用于从队列中取出数据。在push方法中,我们先获得互斥锁,然后将数据插入队列,并通知等待的线程,最后释放互斥锁。在pop方法中,我们也先获得互斥锁,然后使用条件变量wait方法等待队列非空,这个方法会自动释放互斥锁,并等待调用notify_one方法(在push中)通知它被唤醒。一旦队列非空,我们取出队列头部的数据,并将队列头部出队,最后释放互斥锁。

总的来说,通过使用C++11的标准库中的std::queue,结合互斥锁和条件变量,我们可以方便地实现多生产者单消费者队列。这种队列可以在多线程编程中用于数据的传输和交换,同时保证线程之间的同步和互斥。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章