21xrx.com
2025-03-27 20:43:39 Thursday
文章检索 我的文章 写文章
C++生产者消费者模型
2023-07-08 22:26:51 深夜i     --     --
C++ 生产者 消费者 模型 多线程

C++生产者消费者模型是一种常用的并发编程模型,它通常用于多线程编程中,用于解决生产者和消费者之间的通信和同步问题。这种模型的核心思想就是将生产者与消费者分离开来,通过一个缓冲区来进行数据的交换,生产者将数据生产到缓冲区中,而消费者从缓冲区中获取数据进行消费。

在C++生产者消费者模型中,通常需要使用锁和条件变量来实现线程间的同步与互斥。锁用来保证同一时间只有一个线程可以访问缓冲区,避免多线程同时对缓冲区的读写操作产生冲突。而条件变量则用来实现生产者和消费者之间的通信,当缓冲区已满时,生产者需要等待消费者从缓冲区中取走一部分数据后才能继续向缓冲区写入数据;而当缓冲区为空时,消费者需要等待生产者向缓冲区中写入数据后才能开始从缓冲区中取出数据进行消费。

以下是C++生产者消费者模型的框架代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
// 定义缓冲区的大小
#define BUFFER_SIZE 10
using namespace std;
// 定义一个缓冲区类
class Buffer {
public:
  // 构造函数
  Buffer() {}
  // 生产者往缓冲区写入数据
  void put(int data) {
    unique_lock<mutex> lock(m_mutex);
    // 如果缓冲区已满需要等待
    while (m_queue.size() == BUFFER_SIZE) {
      m_notFull.wait(lock);
    }
    m_queue.push(data);
    m_notEmpty.notify_one();
  }
  // 消费者从缓冲区获取数据
  int get() {
    unique_lock<mutex> lock(m_mutex);
    // 如果缓冲区为空需要等待
    while (m_queue.empty()) {
      m_notEmpty.wait(lock);
    }
    int data = m_queue.front();
    m_queue.pop();
    m_notFull.notify_one();
    return data;
  }
private:
  queue<int> m_queue; // 缓冲区队列
  mutex m_mutex;   // 互斥锁
  condition_variable m_notEmpty; // 不为空
  condition_variable m_notFull; // 不为满
};
// 生产者线程函数
void producer(Buffer& buffer) {
  for (int i = 1; i <= 20; i++) {
    buffer.put(i);
    cout << "Producer put data:" << i << endl;
    this_thread::sleep_for(chrono::milliseconds(500));
  }
}
// 消费者线程函数
void consumer(Buffer& buffer) {
  for (int i = 1; i <= 20; i++) {
    int data = buffer.get();
    cout << "Consumer get data:" << data << endl;
    this_thread::sleep_for(chrono::milliseconds(1000));
  }
}
int main() {
  Buffer buffer;
  thread t1(producer, ref(buffer));
  thread t2(consumer, ref(buffer));
  t1.join();
  t2.join();
  return 0;
}

在这个例子中,生产者线程不断地向缓冲区中写入数据,而消费者线程则不断地从缓冲区中取出数据进行消费。生产者和消费者之间通过缓冲区进行数据的交换,当缓冲区已满或者为空时,生产者和消费者都需要等待。在该例子中,每隔一定时间,生产者和消费者分别对缓冲区进行操作来模拟实际应用中的情况。

总之,C++生产者消费者模型是一种常用的并发编程模型,它可以极大地简化多线程编程中的通信和同步问题。通过使用锁和条件变量,我们可以很方便地实现生产者和消费者之间的同步和数据传输,从而提高程序的效率和可靠性。

  
  

评论区