生产者-消费者问题

#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<thread>
#include<windows.h>
#define n 10 //缓冲区大小为10
using namespace std;
int in = 0, out = 0;
int buffer[n];
int mutex = 1, empty_ = n, full = 0;//mutex互斥信号量实现诸线程对缓冲池的互斥使用,
//信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
void wait(int &s){
	while (s <= 0);//若s <=0 则一直等待
	--s;//上锁
}
void signal(int &s){
	++s;//释放
}

int product(){//随机产生消息
	srand((unsigned)time(NULL));
	for (int i = 0;i < 10;++i) {
		return rand();
	}
}

void producer(){//生产者线程
	while (1){
		int nextp = product();//产生消息
		wait(empty_);//如empty_不为0,--empty,empty为0就等待
		wait(mutex);//上锁
		cout << "生产者产生了消息:" << nextp << endl;
		Sleep(1000);
		buffer[in] = nextp;
		in = (in + 1) % n;
		//Sleep(1000);
		signal(mutex);//释放
		signal(full);//和wait(empty)成对出现
	}
}

void consumer(){//消费者线程
	while (1){
		wait(full);//上锁
		wait(mutex);//上锁
		cout  << "消费者尝试获取消息" << endl;
		int nextc = buffer[out];
		out = (out + 1) % n;
		cout << "成功!消费者获取了消息:" << nextc<<endl;
		Sleep(1000);
		signal(mutex);//解锁
		signal(empty_);//解锁
	}
}

int main(){
	thread pro(producer),pro2(producer),pro3(producer);//创建三个生产者线程
	thread con(consumer);//创建一个消费者线程

	pro.join();//等待线程结束再执行main函数

	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值