21xrx.com
2024-12-22 21:20:02 Sunday
登录
文章检索 我的文章 写文章
C++实现生产者消费者模型
2023-07-13 05:47:03 深夜i     --     --
C++ 生产者 消费者 模型 实现

在并发编程中,生产者消费者模型是一个重要的概念。生产者消费者模型是指一个生产者线程生成数据,而另一个消费者线程消费数据的过程。这个模型是一种常见的读写数据的方式,特别是在多线程和多进程编程中。

C++提供了一种自然的方式来实现生产者消费者模型。在C++中,可以使用线程来实现生产者消费者模型,而线程之间可以使用共享的缓冲区来交换数据。下面是一个使用C++实现生产者消费者模型的例子:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

#include <queue>

using namespace std;

const int MAX_SIZE = 10;

queue<int> buffer;

mutex m;

condition_variable produce_cv, consume_cv;

void produce() {

  for (int i = 0; i < MAX_SIZE; i++) {

    unique_lock<mutex> lck(m);

    while (buffer.size() == MAX_SIZE) {

      produce_cv.wait(lck);

    }

    buffer.push(i);

    cout << "Produced: " << i << endl;

    consume_cv.notify_one();

  }

}

void consume() {

  while (1) {

    unique_lock<mutex> lck(m);

    while (buffer.empty()) {

      consume_cv.wait(lck);

    }

    int val = buffer.front();

    buffer.pop();

    cout << "Consumed: " << val << endl;

    produce_cv.notify_one();

  }

}

int main() {

  thread producer(produce);

  thread consumer(consume);

  producer.join();

  consumer.join();

  return 0;

}

这个程序使用了STL的queue来表示缓冲区,使用了线程和互斥量来实现并发。在主函数中,我们创建了一个生产者线程和一个消费者线程。生产者线程不断地生产数据并将其存入缓冲区,消费者线程从缓冲区中取出数据并消费。

在produce()函数中,线程会首先获取互斥量m,然后利用while循环来判断缓冲区是否已满。如果缓冲区已满,则调用produce_cv.wait(lck)来挂起线程并且等待消费者线程发出信号。如果缓冲区不满,则将数据存入缓冲区,并通过consume_cv.notify_one()通知消费者线程可以消费数据了。这个函数的执行过程是一个不断循环的过程。

在consume()函数中,线程也会首先获取互斥量m,然后利用while循环来判断缓冲区是否为空。如果缓冲区为空,则调用consume_cv.wait(lck)来挂起线程并且等待生产者线程发出信号。如果缓冲区不为空,则从缓冲区中取出数据并消费,并通过produce_cv.notify_one()通知生产者线程可以生产数据了。这个函数的执行过程同样是一个不断循环的过程。

在程序的最后,我们需要等待生产者线程和消费者线程执行完毕,并通过join()函数来实现。

总的来说,C++提供了非常方便的方式来实现生产者消费者模型,它结合了线程、互斥量、条件变量和队列等多种技术,可以帮助我们有效地完成并发编程的任务。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复