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

2258

被折叠的 条评论
为什么被折叠?



