这几天操作系统作业,大致写了些,有什么不对的地方请各位大佬指出,在下必感激不尽。
#include<iostream>
#include<windows.h>
#include<pthread.h>
#include <semaphore.h>
using namespace std;
class BUFFER
{
public:
BUFFER();
~BUFFER();
int getSize();
int getmaxSize();
int gettop();
void addTop();
void decTop();
private:
int *elements;
int top,maxSize;
};
BUFFER::BUFFER()
{
top = 0;
int n;
cout<<"Please input buffer size:"<<endl;
cin>>n;
maxSize = n;
elements = new int[maxSize];
cout<<endl;
}
BUFFER::~BUFFER()
{
delete elements;
}
int BUFFER::getSize()
{
return top;
}
int BUFFER::getmaxSize()
{
return maxSize;
}
int BUFFER::gettop()
{
return top;
}
void BUFFER::addTop()
{
top++;
}
void BUFFER::decTop()
{
top--;
}
sem_t _full,_empty,_mutex,_mutex1;//三个信号量 定义
BUFFER *buf = new BUFFER();//创建BUFFER的类 大小BufferSize
void* producer(void* args)
{
//互斥加锁
sem_wait(&_mutex);
int a,*p;
p = &a;
sem_getvalue(&_empty,p);//看信号量 _empty 的值
if(a > 0) //如果信号量有值 意思是不空 模拟空白块满
{
sem_wait(&_empty); //减一个 _empty 的信号量 模拟取一个空白快
buf->addTop(); //指针++ 移动 模拟生产
sem_wait(&_mutex1);
cout << endl << "Product successfully!" << endl << endl;
sem_post(&_mutex1);
sem_post(&_full); //释放出一个_full 信号量 模拟 有数据的数组加一操作
sem_post(&_mutex);
pthread_exit(NULL); //退出线程
}
else //信号量无值 意思 _empty 为空 模拟没有空白快
{
sem_post(&_mutex);
sem_wait(&_mutex1);
cout << endl << "Producer sleep wait consumer!" << endl << endl;
sem_post(&_mutex1);
while(1)
{
Sleep(1000);//线程睡眠
sem_getvalue(&_full,p);//每过一段时间 看一下_full是否大于0 意思是是否能放数据
if(a > 0) //如果信号量有值 意思是不空 模拟空白块满
{
sem_wait(&_empty); //取一个 _empty 的信号量 模拟取一个空白快
buf->addTop(); //指针++ 移动 模拟生产
sem_wait(&_mutex1);
cout << endl << "Product successfully!" << endl << endl;
sem_post(&_mutex1);
sem_post(&_full); //释放出一个_full 信号量 模拟 有数据的数组加一操作
pthread_exit(NULL); //退出线程
}
}
}
}
void* consumer(void* args)
{
sem_wait(&_mutex);
int a,*p;
p = &a;
sem_getvalue(&_full,p);//看信号量 _full 的值
if(a > 0)
{
sem_wait(&_full);
buf->decTop();
sem_wait(&_mutex1);
cout << endl << "Consume successfully!" << endl << endl;
sem_post(&_mutex1);
sem_post(&_empty);
sem_post(&_mutex);
pthread_exit(NULL);
}
else
{
sem_post(&_mutex);
sem_wait(&_mutex1);
cout << endl << "Consumer sleep wait producer!" << endl << endl;
sem_post(&_mutex1);
while(1)
{
Sleep(1000);
sem_getvalue(&_empty,p);
if(a > 0) //如果信号量有值 意思是不空 模拟空白块满
{
sem_wait(&_full); //取一个 _empty 的信号量 模拟取一个空白快
buf->decTop(); //指针++ 移动 模拟生产
sem_wait(&_mutex1);
cout << endl << "Consume successfully!" << endl << endl;
sem_post(&_mutex1);
sem_post(&_empty); //释放出一个_full 信号量 模拟 有数据的数组加一操作
pthread_exit(NULL); //退出线程
}
}
}
}
int main()
{
int i;
sem_init(&_full,0,0); //模拟有数据的块 数量为0
sem_init(&_empty,0,buf->getmaxSize()); //模拟空白块 数量为满
sem_init(&_mutex,0,1); //互斥信号量
sem_init(&_mutex1,0,1);
pthread_t id1,id2;
while(i!=4)
{
sem_wait(&_mutex1);
cout << "Please enter the operating code:" << endl;
cout << "1.Produce the products; 2.Consume the products;" << endl;
cout << "3.Show buffer; 4.Leave system" << endl;
sem_post(&_mutex1);
cin>>i;
switch(i)
{
case 1:
pthread_create(&id1,NULL,producer,NULL);
break;
case 2:
pthread_create(&id2,NULL,consumer,NULL);
break;
case 3:
cout << endl << "Buffer have used:"<< buf->gettop() << " " << "you can use:" << (buf->getmaxSize()-buf->getSize()) << endl << endl;
break;
case 4:
cout << endl << "Leave successfully!" << endl << endl;
break;
default:
cout << endl << "Operating code error!" << endl << endl;
}
}
sem_destroy(&_full);
sem_destroy(&_empty);
sem_destroy(&_mutex);
buf->~BUFFER();
return 0;
}