操作系统(C++)——生产者消费者模型

本文详细介绍了使用C++实现生产者消费者模型,通过互斥量和条件变量管理线程间的同步,展示了生产者线程和消费者线程如何协作避免资源冲突。通过实例代码和流程解释,学习了如何在多线程环境下确保数据安全和正确传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、C++实现代码

#include<iostream>
#include<queue>
#include<mutex>
#include<thread>
#include<condition_variable>

using namespace std;

mutex  mymutex;  //定义一个互斥量,即可以理解为一把锁  //防止两个线程同时操作一个内存空间
condition_variable condition;  //定义了一个条件变量,用于线程之间的通信

class Queue {
public:
	void put(int val) //生产物品
	{
		unique_lock<mutex> myunilock(mymutex); //抢占锁,才可以进行执行下面的代码   

		while (!que.empty()) {  //队列不为空,则等待消费者消费
			                            //wait()有两个参数,第二个参数可以为true或false(不写默认为false),若为true,那么wait直接返回并继续执行,若为false,阻塞等待,即下面的作用
			condition.wait(myunilock); //用来等待一个东西:就本例子来说,wait解除互斥锁,并阻塞到本行,知道某个线程调用notify_all成员函数为止
		}
		que.push(val);
		condition.notify_all(); //用于唤醒其他线程,即唤醒消费者线程,进行消费
		cout << "生产了:" << val << " 号产品" << endl;
	}
	int get() {
		unique_lock<mutex> myunilock(mymutex);
		while (que.empty()) { //队列为空,则等待生产者进行生产
			condition.wait(myunilock);
		}
		int val = que.front();
		que.pop();
		condition.notify_all();  //唤醒生产线程,进行生产
		cout << "消费了:" << val << " 号产品" << endl;
		return val;
	}
private:
	queue<int> que;
};
//生产者线程
void producer(Queue* que) {  
	for (int i = 0; i < 10; ++i) {//生产10个产品
		que->put(i);
		this_thread::sleep_for(chrono::milliseconds(100));
	}
}
//消费者线程
void consumer(Queue* que) {  
	for (int i = 0; i < 10; ++i) {
		que->get();
		this_thread::sleep_for(chrono::milliseconds(100));
	}
}
int main() {
	Queue que;  //两个线程共享的队列
	//创建两个线程:生产者和消费者
	thread t1(producer,&que);   
	thread t2(consumer, &que);
	//子线程和主线程汇合
	t1.join();
	t2.join();
	return 0;
}

二、代码流程解释

假设消费者线程,抢占锁成功,生产者获取不到锁,就会阻塞在unique_lock myunilock(mymutex)这行代码处。
消费者先执行 ,判断队列是否为空,发现为空(因为此时还没有生产任何产品),进入while循环,进入等待并释放锁,此时生产线程拿到锁,同样判读队列是否为空,发现为空,不会进入while循环,直接执行生产代码,接着执行condition.notify_all();相当于通知消费者模型,我这边生产出产品了,你可以进行消费,那么消费者就可以退出等待的状态,但是此时并不能执行接下来的消费代码因为此时的消费者线程并没有获取到锁,属于阻塞的状态,当生产者模型的代码完全执行完之后,释放锁,之后消费者获取锁,才能进行消费。若此时生产者线程先与消费者抢占到锁,那么会进入生产者线程,判断队列是否为空,不为空,进入while循环,等待消费者,进入等待并释放锁,接着消费者拿到锁。。。。。重复步骤执行。

学习视频:生产者消费者模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值