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

本文详细介绍了如何使用C++实现多线程的生产者消费者模型,涉及到互斥锁和条件变量的运用,以及在循环队列中,生产者线程最多每次生产8个数据供消费者线程消费。同时,探讨了行锁和表锁在并发控制中的不同特点和开销。

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

一、题目要求

生产者消费者模型:在多线程下生产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; i < 100; ++i)
	{
   
		qu.PopData
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值