使用信号量完成生产者与消费者问题 (C++) (使用线程)

这几天操作系统作业,大致写了些,有什么不对的地方请各位大佬指出,在下必感激不尽。

#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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值