生产者消费者算法

来源:互联网 发布:linux man手册中文版 编辑:程序博客网 时间:2024/05/17 08:29
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <pthread.h>#include <semaphore.h>#define PRODUCER 5#define CONSUMER 5#define BUFFER 10sem_t empty,full;pthread_mutex_t mutex;int buffer[BUFFER];int producer_id=0,consumer_id=0;int index_in,index_out;void print(){    printf("Buffer:\n");    for(int i=0;i<BUFFER;i++)    {        printf("___");    }    printf("\n");    for(int i=0;i<BUFFER;i++)    {        printf("|%d|",buffer[i]);    }    printf("\n");    for(int i=0;i<BUFFER;i++)    {        printf("———");    }    printf("\n");    sleep(3);}void *Producer(){    int id=++producer_id;    while(1)    {               sem_wait(&empty);        pthread_mutex_lock(&mutex);        index_in=index_in%BUFFER;        printf("producer %d in %d.\n",id,index_in);        buffer[index_in]=1;        print();        index_in++;        pthread_mutex_unlock(&mutex);        sem_post(&full);    }}void *Consumer(){    int id=++consumer_id;    while(1)    {           sem_wait(&full);        pthread_mutex_lock(&mutex);        index_out=index_out%BUFFER;        printf("consumer %d in %d.\n",id,index_out);        buffer[index_out]=0;        print();        index_out++;        pthread_mutex_unlock(&mutex);        sem_post(&empty);    }}int main(){    int thread[15];    pthread_t producer[PRODUCER];    pthread_t consumer[CONSUMER];    int inite1=sem_init(&empty,0,BUFFER);    int inite2=sem_init(&full,0,0);    int inite3=pthread_mutex_init(&mutex,NULL);    if(inite1&&inite2)    {        printf("sem initlialize failed \n");        exit(1);    }    if(inite3)    {        printf("mutex initlialize failed \n");        exit(1);    }    for(int i=0;i<PRODUCER;i++)    {        thread[i]=pthread_create(&producer[i],NULL,Producer,NULL);        if(thread[i]!=0)        {            printf("producer %d fail to create \n",i);            exit(0);        }    }    for(int i=0;i<CONSUMER;i++)    {        thread[i]=pthread_create(&consumer[i],NULL,Consumer,NULL);        if(thread[i]!=0)        {            printf("consumer %d fail to create \n",i);            exit(1);        }    }    for(int i=0;i<PRODUCER;i++)    {        pthread_join(producer[i],NULL);    }    for(int i=0;i<CONSUMER;i++)    {        pthread_join(consumer[i],NULL);    }    return 0;}
1 0