一、实验内容
一个生产者和一个消费者共享一个缓冲区maxx
具体参数:生产者A
消费者B
缓冲区单元个数N=10。
根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。
本程序用到如下信号量:
Xian.lock—— 进程开始
Xian.unlock —— 进程结束
Hou.lock —— 输出
Hou.unlock—— 输出完释放进程
二、背景知识
如何实现两个进程共用一个临界资源,要用到信号量和锁。
三、思路
用锁将两个进程隔开,让生产者和消费者同时享用一个缓冲区。
四、源程序
#include <iostream>
#include <mutex>
#include <thread>
/*
* 1个生产者,1个消费者。
*/
using namespace std;
int com = 5;
int maxx= 10; // 存放产品的上限
mutex xian; //定义一个锁让两个进程不冲突
mutex hou; //定义一个解锁让第一个进程执行完第二个进程能继续执行
void producer(char name) {
int need = 0;
while (1) {
need = rand();
xian.lock();
if (com + need < maxx) {
com += need;
}
else {
need = maxx - com;
com = maxx;
}
hou.lock();
cout << name << "生产者生产了" << need << "件商品,货架上有" << com << "件货品\n";
if (com == maxx)cout << "货架已满\n";
hou.unlock();
xian.unlock();
std::this_thread::sleep_for(std::chrono::milliseconds(300));//设置延迟,不让他变得太快
}
}//生产者进程函数,让生产者生产产品
void consumer(char name) {
int need = 0;
while (1) {
need = rand();
xian.lock();
if (com - need > 0) {
com -= need;
}
else {
need = com;
com = 0;
}
hou.lock();
cout << name << "消费者消费了" << need << "件商品,货架上有" << com << "件货品\n";
if (com == 0)cout << "货架已空\n";
hou.unlock();
xian.unlock();
std::this_thread::sleep_for(std::chrono::milliseconds(300));//设置延迟,不让他变得太快
}
}//消费者进程函数,让消费者消费产品
int main() {
srand(time(NULL));
thread pa(&producer, 'A');//创建生产者线程
thread ca(&consumer, 'B');//创建消费者线程
pa.join();
ca.join();
return 0;
}
五、运行结果
得到消费者和生产者消费的,生产的以及缓冲区实时的产品数。
六、结论
消费者生产者问题需要使用信号量机制。