【C++多线程】生产者消费者模型

一、题目要求

生产者消费者模型:在多线程下生产0~100个数,生产者线程1生产20个数据后,消费者线程1进行消费输出。

二、解答

使用到的技术:互斥锁、条件变量、多线程、双端队列

#if 1
#include<iostream>
#include<deque>
#include<mutex>
#include<condition_variable>
using namespace std;

mutex mtx;
std::condition_variable cv;

class Queue
{
   
public:
	//生产数据: index是生产者编号,val是生产的结果
	void PushData(int index, int val)
	{
   
		unique_lock<mutex> lock(mtx);
		//size == 20
		cv.wait(lock, [this]()->bool {
   return qu.size() != 20; });
		qu.push_back(val);
		cv.notify_all();
		cout << "Producer:" << index << " " << "val:" << val << endl;
	}
	//消费数据: index是消费者编号
	void PopData(int index)
	{
   
		unique_lock<mutex> lock(mtx);
		//!qu空 ->真 , 继续执行
		cv.wait(lock, [this]()->bool {
   return !qu.empty(); });
		int val = qu.front();
		qu.pop_front();
		cv.notify_all();
		cout << "Customer:" << index << " " << "val:" << val << endl;
	}
private:
	deque<int> qu;
};
void Producer(Queue& qu, int index)
{
   
	for (int i = 0; i < 100; ++i)
	{
   
		qu.PushData(index, i);
	}
}
void Customer(Queue& qu, int index)
{
   
	for (int i =
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多个生产者消费者问题可以使用多线程和同步机制来实现。 下面是一个使用C++11中的线程库和互斥锁(mutex)和条件变量(condition_variable)来解决多个生产者消费者问题的示例代码: ```c++ #include <iostream> #include <thread> #include <vector> #include <queue> #include <mutex> #include <condition_variable> using namespace std; // 生产者消费者问题中的缓冲区 queue<int> buffer; // 互斥锁条件变量 mutex mtx; condition_variable cv; // 生产者线程函数 void producer(int id) { for (int i = 0; i < 10; ++i) { // 生产一个任务 int task = i + id * 10; { // 加锁 unique_lock<mutex> lock(mtx); // 如果缓冲区已满,等待 while (buffer.size() == 10) { cv.wait(lock); } // 将任务放入缓冲区 buffer.push(task); cout << "Producer " << id << " produces task " << task << endl; // 通知等待的消费者线程 cv.notify_all(); } } } // 消费者线程函数 void consumer(int id) { while (true) { { // 加锁 unique_lock<mutex> lock(mtx); // 如果缓冲区为空,等待 while (buffer.empty()) { cv.wait(lock); } // 从缓冲区取出一个任务 int task = buffer.front(); buffer.pop(); cout << "Consumer " << id << " consumes task " << task << endl; // 通知等待的生产者线程 cv.notify_all(); } // 模拟消费任务的过程 this_thread::sleep_for(chrono::milliseconds(100)); } } int main() { // 创建两个生产者线程和三个消费者线程 vector<thread> producers, consumers; for (int i = 0; i < 2; ++i) { producers.emplace_back(producer, i); } for (int i = 0; i < 3; ++i) { consumers.emplace_back(consumer, i); } // 等待所有线程结束 for (auto& t : producers) { t.join(); } for (auto& t : consumers) { t.join(); } return 0; } ``` 在上面的示例代码中,生产者线程每次生产一个任务并将其放入缓冲区,消费者线程每次从缓冲区取出一个任务并消费。如果缓冲区已满,生产者线程会等待,直到缓冲区有空闲位置;如果缓冲区为空,消费者线程会等待,直到缓冲区有任务。在等待时,线程会释放互斥锁,直到条件变量通知它继续执行。同时,生产者线程在将任务放入缓冲区后会通知等待的消费者线程,消费者线程在消费任务后会通知等待的生产者线程。这样就可以保证生产者和消费者的同步和互斥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值