os大作业:生产者与消费者进程

源代码:

#include<bits/stdc++.h>
#include<pthread.h>
#include<unistd.h>
#include <cstdlib>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
#include<windows.h>
//#include<fstream.h>
#include<string>
#include<conio.h>
using namespace std;

#define max 10//缓冲区上限
int buffer[max];
int pro1();
int pro2();
int con1();
int con2();

struct huanchongqu
{
int buffer[max];//缓冲区数组
std ::condition_variable full ;//条件变量,已生产产品数
std ::condition_variable empty ;//条件变量,可消费产品数
mutex mutex ;//互斥信号量
int in;//缓冲区生产数下标变量
}it;//建立一个此数据类型的变量it

void chushihua()//初始化
{
it.in = 0;//缓冲区数组初始位置
}
//phread_mutex_t
//生产者线程任务
void Producer()
{
cout << "1" << endl;
if(it.in < max - 1)//缓冲区没满
pro1();
else
cout << "缓冲区已满" << endl;
}

//生产者进程生产产品
int pro1()
{
cout << "进行生产者进程1" << endl;
std::unique_lock<std::mutex> lock(it.mutex);//对mutex上锁
while(it.in == max -1)
{
cout << "缓冲区满,等待空余空间生产产品" << endl;
(it.full).wait(lock);//等待“有空余空间”这一条件发生
}

cout << "请输入一个数字" << endl;
cin >> it.buffer[it.in];
it.in++;
lock.unlock();//解锁
//phread_mutex_unlock(&it.mutex);
int i;
cout << "进行生产者进程2请输入2;切换消费者1进程请输入3;结束此进程请输入0;返回初始界面请输入其他数字" << endl;
cin >> i;
if(i == 0)
return 0;
else if(i == 2)
pro2();
else if(i == 3)
con1();

return 0;
}

//与生产者进程1过程类似
int pro2()
{
cout << "进行生产者进程2" << endl;
std::unique_lock<std::mutex> lock(it.mutex);
while(it.in == max -1)
{
cout << "缓冲区满,等待空余空间生产产品" << endl;
(it.full).wait(lock);//等待“有空余空间”这一条件发生
}

cout << "请输入一个数字" << endl;
cin >> it.buffer[it.in];
it.in++;
lock.unlock();
int i;
cout << "进行生产者进程1请输入1;切换消费者1进程请输入3;结束此进程请输入0;返回初始界面请输入其他数字" << endl;
cin >> i;
if(i == 0)
return 0;
else if(i == 1)
pro1();
else if(i == 3)
con1();

return 0;
}

//消费者线程任务
void Consumer()
{
if(it.in > 0 )
con1();
else
cout << "缓冲区无产品" <<endl;
}


//消费者进程1
int con1()
{
cout << "进行消费者进程1" << endl;
std::unique_lock<std::mutex> lock(it.mutex);
while(it.in == 0)
{
cout << "缓冲区无产品" << endl;
(it.empty).wait(lock);//等待“有缓冲区不为空”这一条件发生
}

//cout << "消费者进程:输出一个数字" << endl;
cout << it.buffer[it.in-1] << endl;//消费者进程:输出数组最后一个数字
it.in--;
lock.unlock();
int i;
cout << "进行生产者进程请输入1或者2;进行消费者2进程请输入4;结束此进程请输入0;返回初始界面请输入其他数字" << endl;
cin >> i;
if(i == 0)
return 0;
else if(i == 1)
pro1();
else if(i == 2)
pro2();
else if(i == 4)
con2();

return 0;
}


int con2()
{
cout << "进行消费者进程2" << endl;
std::unique_lock<std::mutex> lock(it.mutex);
while(it.in == 0)
{
cout << "缓冲区无产品" << endl;
(it.empty).wait(lock);//等待“有缓冲区不为空”这一条件发生
}

//cout << "消费者进程:输出一个数字" << endl;
cout << it.buffer[it.in-1];
it.in--;
lock.unlock();
int i;
cout << "进行生产者进程请输入1或者2;进行消费者1进程请输入3;结束此进程请输入0;返回初始界面请输入其他数字" << endl;
cin >> i;
if(i == 0)
return 0;
else if(i == 1)
pro1();
else if(i == 2)
pro2();
else if(i == 3)
con1();

return 0;
}

int main()
{
chushihua();
int i = 1;
while(i != 0)
{
cout << "请输入想进行的操作" << endl;
cout << "1:生产者线程 2:消费者线程 0:退出进程" << endl;
cin >> i;
if(i == 1) Producer();
if(i == 2) Consumer();
if(i == 0) break;
}

return 0;
}

 

背景知识:系统中多道程序并发执行能有效的改善资源利用率,提高系统的吞吐量,但这会使系统变得更复杂。如果不能采取有效措施度多个进程进行妥善管理,必然会因为这些进程对系统资源的无序争夺给系统造成混乱,致使每次结果存在着不确定性。为保证多个进程能有条不紊的运行,再多道程序系统中,必须引入进程同步机制。

 

实验内容为实现生产者-消费者问题

 

思路:建立一个含有缓冲区大小、指示下标、以及首尾下标的结构数组。编写初始化函数令指示下标为0。编写生产者函数和消费者函数,在主函数中输入数字以调用生产者或者消费者线程来进行生产或者消费。当缓冲区为空时,进行消费者进程将会造成死锁,直到缓冲区不为空这个条件满足;当缓冲区满时,进行生产者进程将会造成死锁,直到缓冲区有空余空间这个条件满足。每次生产或者消费完后都会由用户进行输入数字来进行下一步的操作。

 

遇到的问题:对死锁和的用途不熟悉导致运行错误,还需要多使用信号量,过程中信号量的编写经常出现错误。

 

运行结果:如下图示

 

 

 

 

 

 

 

 死锁

 

 

结论:一组生产者向一组消费者提供产品,它们共享一个有界缓冲池,生产者向其中投放产品,消费者从中取得产品。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将产品送入缓冲池,只要缓冲池未空,消费者可从缓冲池取走一个产品。一旦缓冲区无产品进行消费者进程或者缓冲区满进行生产者进程都会导致死锁。

 

posted @ 2022-06-06 19:37  珞白  阅读(131)  评论(0)    收藏  举报