生产者消费者问题

来源:互联网 发布:淘宝网秋季男装外套 编辑:程序博客网 时间:2024/05/16 08:03

最近复习了一下以前学的东西--生产者消费者问题。

生产者每生产一个product,就会添加到一个队列里,队列容量是PACKNUM(宏定义),队列满则阻塞停止生产。消费者每次会从队列里去一个product,当product被消费完了,就阻塞,让生产者工作。队列使用互斥体(mutex)互斥读写,阻塞的生产者或消费者使用条件变量(Condition Variable)唤醒。队列是基于FIFO模型读写的。

/*  * File:   main.c * Author: kira * * Created on 2012年4月26日, 下午3:37 */#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define PACKETNUM 10struct msg{    struct msg *next;    int num;};int sum = 0;struct msg *head = NULL;pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;pthread_cond_t full_product = PTHREAD_COND_INITIALIZER;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void *consumer(void* p){    struct msg *mp;    for (;;)     {        pthread_mutex_lock(&lock);        while (NULL == head)         {            printf("No products\n");            pthread_cond_wait(&has_product, &lock);        }                mp = head;        head = mp->next;          sum --;        printf("Consum %d,left %d products!\n",mp->num,sum);        pthread_mutex_unlock(&lock);        pthread_cond_signal(&full_product);               free(mp);        sleep(rand()%5);            }}void * producer(void* p){    for(;;)    {        pthread_mutex_lock(&lock);                while(PACKETNUM == sum)        {            printf("The packet queue is full!\n");            pthread_cond_wait(&full_product,&lock);        }        struct msg *mp = malloc(sizeof(struct msg));        mp->num = rand()%1000 + 1;        mp->next = NULL;        printf("Produce a num %d.There are %d products\n",mp->num,sum);        if(NULL == head)        {            head = mp;        }        else        {            struct msg *tmp = head;            while(NULL != tmp->next)            {               tmp = tmp->next;            }            tmp->next = mp;        }        sum ++;        pthread_mutex_unlock(&lock);        pthread_cond_signal(&has_product);        sleep(rand()%5);    }}/* *  */int main(int argc, char** argv) {    pthread_t pid,cid;        pthread_create(&pid,NULL,&producer,NULL);    pthread_create(&cid,NULL,&consumer,NULL);        pthread_join(pid,NULL);    pthread_join(cid,NULL);        return (EXIT_SUCCESS);}


原创粉丝点击