21xrx.com
2024-11-22 08:24:20 Friday
登录
文章检索 我的文章 写文章
使用C++实现生产者消费者模型
2023-06-27 13:04:48 深夜i     --     --
C++ 生产者 消费者 队列 线程安全

生产者消费者模型是一种经典的并发编程模型,常用于解决多线程数据共享和同步问题。在这个模型中,生产者不断地生成数据并放入共享的队列中,消费者则从队列中取出数据进行处理。为了保证数据的安全性,需要对队列进行同步和互斥。

在C++中,可以使用标准库中的线程和同步库来实现生产者消费者模型。下面提供一个简单的实现示例:

#include

#include

#include

#include

#include

using namespace std;

queue data; //共享队列

mutex mtx; //互斥锁

condition_variable cv; //条件变量

const int MAX_SIZE = 10; //队列最大容量

//生产者线程函数

void producer() {

  while (true) {

    unique_lock ul(mtx);

    //等待队列不满

    cv.wait(ul, []{ return data.size() < MAX_SIZE; });

    //生产数据并加入队列

    int dat = rand() % 100;

    data.push(dat);

    cout << "[+] Produced " << dat << endl;

    //唤醒一个消费者线程

    cv.notify_one();

  }

}

//消费者线程函数

void consumer() {

  while (true) {

    unique_lock ul(mtx);

    //等待队列不空

    cv.wait(ul, []{ return !data.empty(); });

    //取出数据并处理

    int dat = data.front();

    data.pop();

    cout << "[-] Consumed " << dat << endl;

    //唤醒一个生产者线程

    cv.notify_one();

  }

}

int main() {

  //创建多个生产者和消费者线程

  thread p1(producer);

  thread p2(producer);

  thread c1(consumer);

  thread c2(consumer);

  //等待所有线程结束

  p1.join();

  p2.join();

  c1.join();

  c2.join();

  return 0;

}

在上述代码中,使用了互斥锁和条件变量来保证队列的同步和互斥。生产者在加入数据时会等待队列不满并唤醒一个消费者线程,消费者在取出数据时会等待队列不空并唤醒一个生产者线程。通过使用多个生产者和消费者线程,可以更好地利用系统资源和提高效率。

总结起来,生产者消费者模型是多线程编程中的常见模型之一,可以用于解决线程间数据共享和同步问题。在C++中,通过使用标准库中的线程和同步库,可以相对容易地实现一个简单的生产者消费者模型。

  
  

评论区

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