生产者消费者问题———pthread实现

pthread_t 用法;

创建自旋锁 pthread_mutex_t ;

创建条件锁 pthread_cond_t(需要轮询判断条件);

输入2 2 15测试
#include<iostream>
#include<pthread.h>
#include<ctime>
#include <unistd.h>
#include<queue>
#include<semaphore.h>
using namespace std;
pthread_mutex_t mutexs;
pthread_mutex_t print;
pthread_mutex_t all;
pthread_cond_t full=PTHREAD_COND_INITIALIZER;
pthread_cond_t empty=PTHREAD_COND_INITIALIZER;
int k;
typedef struct item_st{
    int product_id;
    time_t produce_time;
    int producer_id;
}ITEM;
typedef struct buffer_st{
    bool isempty=true;
    ITEM item;
    int len=0;
    buffer_st * nextbuf= nullptr;
}BUFFER;
BUFFER product;
int allproductid=1;
int allcustomer=0;
int maxn=4;
void *customer(void *arg){
    while(true){
        long customer_id=(long)arg;

        pthread_mutex_lock(&mutexs);
        pthread_mutex_lock(&print);
        cout<<"消费者"<<customer_id<<"准备进入临界区"<<endl;
        pthread_mutex_unlock(&print);
        if(allcustomer>=k){
            cout<<"结束!!!!"<<endl;
            pthread_mutex_unlock(&mutexs);
            pthread_exit(NULL);
        }
        while(product.len==0){
            pthread_cond_signal(&empty);
            pthread_cond_wait(&full,&mutexs);
        }
        pthread_mutex_lock(&print);
        cout<<"消费者"<<customer_id<<"已经进入临界区"<<endl;
        pthread_mutex_unlock(&print);
        allcustomer+=1;
        BUFFER* temp=&product;
        for(int i=1;i<product.len;i++){
            temp=temp->nextbuf;
        }
        pthread_mutex_lock(&print);
        cout<<"消费者"<<customer_id<<"取出产品id为"<<temp->item.product_id<<endl;
        pthread_mutex_unlock(&print);
        int cur=temp->item.product_id;
        pthread_mutex_lock(&print);
        cout<<"该产品是生产者"<<temp->item.producer_id<<"于"<<ctime(&temp->item.produce_time)<<"生产"<<endl;
        pthread_mutex_unlock(&print);
        temp= nullptr;
        product.len--;

        pthread_mutex_lock(&print);
        cout<<"-----------此时缓冲区内有如下----------"<<endl;
        cout<<"生产时间\t\t\t"<<"生产者\t"<<"产品id"<<endl;
        BUFFER *list=&product;
        for(int i=0;i<product.len;i++){
            cout<<ctime(&(list->item.produce_time))<<"\t"<<list->item.producer_id<<"\t"<<list->item.product_id<<endl;
            if(i<product.len-1)
            list=list->nextbuf;
        }
        pthread_mutex_unlock(&print);
        pthread_mutex_lock(&print);

        cout<<"--------------------------"<<endl;
        cout<<"消费者"<<customer_id<<"已经离开临界区"<<endl;
        pthread_mutex_unlock(&print);
        pthread_mutex_unlock(&mutexs);
        pthread_cond_signal(&empty);


        int during=rand()%5+1;
        pthread_mutex_lock(&print);
        cout<<"消费者"<<customer_id<<"开始消费"<<cur<<endl;
        pthread_mutex_unlock(&print);
        sleep(during);
        time_t t;
        time(&t);
        pthread_mutex_lock(&print);
        cout<<"消费者"<<customer_id<<"于"<<ctime(&t)<<"消费产品"<<cur<<"完毕"<<",用时"<<during<<"s"<<endl;
        pthread_mutex_unlock(&print);
    }
    return 0;
}

void *producer(void *arg){
    int current_product;
    while(true){
        long producer_id=(long)arg;

        pthread_mutex_lock(&all);
        current_product=allproductid;
        if(allproductid==k+1){
            cout<<"退出!!!!"<<endl;
            pthread_mutex_unlock(&all);
            pthread_exit(NULL);
        }
        allproductid++;
        int during=rand()%5+1;
        pthread_mutex_lock(&print);
        cout<<"生产者"<<producer_id<<"开始生产产品"<<current_product<<endl;
        pthread_mutex_unlock(&print);
        sleep(during);
        time_t t;
        time(&t);
        pthread_mutex_lock(&print);
        cout<<"生产者"<<producer_id<<"于"<<ctime(&t)<<"生产完毕"<<",用时"<<during<<"s"<<endl;
        pthread_mutex_unlock(&print);
        pthread_mutex_unlock(&all);

        pthread_mutex_lock(&mutexs);
        pthread_mutex_lock(&print);
        cout<<"生产者"<<producer_id<<"准备进入临界区"<<endl;
        pthread_mutex_unlock(&print);
        while(product.len==maxn){
            pthread_cond_signal(&full);
            pthread_cond_wait(&empty,&mutexs);
        }
        pthread_mutex_lock(&print);
        cout<<"生产者"<<producer_id<<"已经进入临界区"<<endl;
        pthread_mutex_unlock(&print);
        BUFFER *temp=&product;

        if(product.len==0){
            temp->isempty= false;
            temp->item.producer_id=producer_id;
            temp->item.produce_time=t;
            temp->item.product_id=current_product;
            temp->nextbuf= nullptr;
            product.len=1;
        }
        else if(product.len<maxn){
            for(int i=0;i<product.len;i++){
                temp=temp->nextbuf;
            }
            BUFFER *one=new BUFFER ;
            one->isempty= false;
            one->item.producer_id=producer_id;
            one->item.produce_time=t;
            one->item.product_id=current_product;
            one->nextbuf= nullptr;
            temp=one;
            product.len++;
        }
        pthread_mutex_lock(&print);
        cout<<"生产者"<<producer_id<<"已经把产品"<<current_product<<"放入缓冲区"<<endl;
        cout<<"-----------此时缓冲区内有如下----------"<<endl;
        cout<<"生产时间\t\t\t"<<"生产者\t"<<"产品id"<<endl;
        BUFFER *list=&product;
        for(int i=0;i<product.len;i++){
            cout<<ctime(&(list->item.produce_time))<<"\t"<<list->item.producer_id<<"\t"<<list->item.product_id<<endl;
            if(i==product.len-1)
                break;
        }
        pthread_mutex_unlock(&print);
        pthread_mutex_lock(&print);
        cout<<"-----------------------"<<endl;
        cout<<"生产者"<<producer_id<<"已经离开临界区"<<endl;
        pthread_mutex_unlock(&print);
        pthread_mutex_unlock(&mutexs);
        pthread_cond_signal(&full);
    }
    return 0;
}
int main(){
    pthread_mutex_init(&mutexs,NULL);
    pthread_mutex_init(&print,NULL);
    pthread_mutex_init(&all,NULL);
    int c_num,p_num;
    cin>>p_num>>c_num>>k;
    pthread_t pro_thread[10];
    pthread_t cus_thread[10];
    int a,b,c,d;
    int c1=1;
    int c2=2;
    int c3=3;
    int c4=4;
    int p1=1;
    int p2=2;
    for(a=1;a<=p_num;a++){

            pthread_create(&pro_thread[a], NULL, producer, (void *) a);
    }
    for(b=1;b<=c_num;b++){
            pthread_create(&cus_thread[b], NULL, customer, (void *) b);
    }
    for(c=0;c<p_num;c++){
        pthread_join(pro_thread[c],NULL);
    }
    for(d=0;d<c_num;d++){
        pthread_join(cus_thread[d],NULL);
    }

    pthread_mutex_destroy(&mutexs);
    pthread_mutex_destroy(&print);
    return 0;
}

 

posted @ 2022-11-07 17:32  jakekiller00  阅读(49)  评论(0编辑  收藏  举报