经典同步问题--生产者和消费者

本文探讨了经典的生产者-消费者问题,重点在于多线程环境下的同步策略。生产者线程生成项目并放入有限大小的缓冲区,而消费者线程则从中取出。为确保线程安全,引入了互斥锁来同步对缓冲区的操作。当缓冲区满时,生产者会阻塞,等待消费者消费;反之,当缓冲区空时,消费者将等待新的产品。文中还提供了图文示例和代码实现。

生产者--消费者问题

      生产者和消费者线程共享一个有n个槽的有限缓冲区。生产者生产的新项目不断插入有限缓冲区,

消费者不停地从缓冲区取出项目。这里涉及操作共享变量的同步问题 还有有限缓冲区的问题,操作

共享缓冲区时,需要设置互斥变量让线程同步;缓冲区满的时候生产者停止生产,等待缓冲区有空间;

缓冲区空的时候,消费者不能忘缓冲区取,等待缓冲区有产品。


图文示例





代码实现


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>

typedef struct BUF{
    int      *arr;
    int      size;
    int      front,rear;
    sem_t    mutex; //互斥量
    sem_t    book_num; //生产的书
    sem_t    left_space; //还剩下的生产空间
} BUF;

BUF    *buf;
int    item = 0;

void init_buf(BUF *buf, int size)//初始化缓冲空间
{
    buf->arr = (int *)malloc(size * sizeof(int));
    buf->size = size; 
    buf->front = buf->rear = 0;
    sem_init(&(buf->mutex),0,1);
    sem_init(&(buf->book_num),0,0);
    sem_init(&(buf->left_space),0,size);
}

void free_buf(BUF *buf)
{
    free(buf->arr);
}

void *product_book(void *argv)
{
	pthread_detach(pthread_self());//设置为分离态
    while(1){
        sem_wait(&buf->left_space);
        sem_wait(&buf->mutex);
        ++item;
        buf->arr[(++buf->rear)%(buf->size)] = item;
        printf("##%ld--product the NO.%d book\n",(long)pthread_self(),item);
        sem_post(&buf->mutex);
        sem_post(&buf->book_num);
        usleep(300000);
    }
    return NULL;
}


void * buy_book(void *argv)
{
    int item;
	pthread_detach(pthread_self());//设置为分离态
    while(1){
        sem_wait(&buf->book_num);
        sem_wait(&buf->mutex);
        item = buf->arr[(++buf->front) % (buf->size)];
        printf("**%ld--Reader buy the NO.%d book\n",(long)pthread_self(),item);
        sem_post(&buf->mutex);
        sem_post(&buf->left_space);
        usleep(500000);
    }

    return NULL;
}


int main(int argc, char **argv)// ./a.out bufsize producers readers
{
    int i = 1, producers = 1, readers = 2, size = 5;
					//默认属性
	
    pthread_t   tid1,tid2;
	
	if(argc == 4){  
		size = atoi(argv[i++]);
		producers = atoi(argv[i++]);
		readers = atoi(argv[i++]);
	}
	
    buf = (BUF *)malloc(sizeof(BUF));
    init_buf(buf,size);


	for( i = 0; i < producers; ++i)
		pthread_create(&tid1,NULL,product_book,NULL);
    sleep(1);


	for( i = 0; i < readers; ++i)
		pthread_create(&tid2,NULL,buy_book,NULL);
    
    while(1){
        sleep(5);
    }

     free_buf(but);
	
    return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值