生产者消费者模式in C

来源:互联网 发布:螺旋楼梯计算软件 编辑:程序博客网 时间:2024/06/07 22:52
#include<stdio.h>#include<pthread.h>#include<semaphore.h>#define bufsize 10#define produce_num 3#define consume_num 3int buffer[bufsize];int product_id=0;sem_t unused;sem_t used;pthread_mutex_t mutex;pthread_t g_thread[produce_num+consume_num];int in=0;int out=0;void *consume(void *param){    int i;    while(1)    {        sem_wait(&used);        pthread_mutex_lock(&mutex);        for(i=0;i<bufsize;i++)        {   printf("%d\t",i);            if(buffer[i]==-1)            {                printf("null\t");            }            else            {                printf("%d\t",buffer[i]);            }            if(out==i)            {                printf("<- consume");            }            printf("\n");        }        buffer[out]=-1;        out=(out+1)%bufsize;        pthread_mutex_unlock(&mutex);        sem_post(&unused);        sleep(1);    }    return NULL;}void *produce(void *param){    int i;    while(1)    {        sem_wait(&unused);        pthread_mutex_lock(&mutex);        for(i=0;i<bufsize;i++)        {   printf("%d\t",i);            if(buffer[i]==-1)            {                printf("null\t");            }            else            {                printf("%d\t",buffer[i]);            }            if(in==i)            {                printf("<- produce");            }            printf("\n");        }        buffer[in]=product_id;        in=(in+1)%bufsize;        product_id++;        pthread_mutex_unlock(&mutex);        sem_post(&used);        sleep(1);    }}int main(){    int i;    sem_init(&unused,0,bufsize);    sem_init(&used,0,0);    pthread_mutex_init(&mutex,NULL);    for(i=0;i<bufsize;i++)    {        buffer[i]=-1;    }    for(i=0;i<consume_num;i++)        pthread_create(&g_thread[i],0,consume,(void *)i);    for(i=0;i<produce_num;i++)        pthread_create(&g_thread[consume_num+i],0,produce,(void *)i);    for(i=0;i<consume_num+produce_num;i++)        pthread_join(g_thread[i],NULL);         sem_destroy(&unused);    sem_destroy(&used);    pthread_mutex_destroy(&mutex);}

原创粉丝点击