生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据

一种实现如下:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

#define MAX 5 //缓冲区的的大小
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

typedef struct{
    char buffer[MAX];
    int count;
}Buffer;

Buffer share = {"", 0};
char ch = 'A';

void *producer(void *arg)
{
    printf("Producer : starting \n");
    while(ch != 'K')
    {
        pthread_mutex_lock(&mutex);
        if(share.count != MAX)
        {
             share.buffer[share.count++] = ch++;
             printf("Producer: put char[%c]\n", ch-1);
             if(share.count == MAX)
             {
                 printf("Producer: signaling full\n");
                 pthread_cond_signal(&cond);//若果缓存满了发送信号
             }
        }
        pthread_mutex_unlock(&mutex);
    }
    sleep(1);
    printf("Produce: Exiting \n");
    pthread_exit(NULL);
}

void *consumer(void *junk)
{
    int i;
    printf("Consumer : starting\n");
    while (ch != 'K')
    {
        pthread_mutex_lock(&mutex);
        printf("\t Consumer : Waiting\n");
        while(share.count != MAX){
            pthread_cond_wait(&cond, &mutex);  //条件不成立释放锁.
            printf("Consumer wating for FULL signal\n");
        }
        printf("Consumer : getting buffer :: ");
        for(i = 0; share.buffer[i] && share.count;++i, share.count--)
            putchar(share.buffer[i]);
        putchar('\n');
        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    pthread_t read, write;
    pthread_create(&read, NULL, (void *) consumer, NULL);
    pthread_create(&write, NULL, (void *)producer, NULL);

    pthread_join(read, NULL);
    pthread_join(write, NULL);
    return 0;
}
View Code

相关文章:

  • 2021-09-04
  • 2021-05-21
猜你喜欢
  • 2021-05-24
  • 2021-10-12
  • 2021-03-10
相关资源
相似解决方案