生产者消费者问题c语言,2个生产者,3个消费者,给出代码和分析
时间: 2023-10-08 12:05:11 浏览: 250
生产者消费者问题是一个经典的并发编程问题,主要是解决多线程环境下生产者和消费者之间的同步问题。在C语言中,我们可以使用线程和信号量来解决这个问题。
以下是一个使用线程和信号量的C语言代码示例,其中有2个生产者和3个消费者。在代码中,我们使用了一个缓冲区来存储生产者生产的数据,并使用信号量来控制生产者和消费者之间的同步。
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0;
int in = 0;
int out = 0;
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
void *producer(void *arg)
{
int item;
while(1)
{
item = rand() % 100; //生产一个随机数
sem_wait(&empty); //等待空缓冲区
pthread_mutex_lock(&mutex); //加锁
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
count++;
printf("Produced item: %d\n", item);
pthread_mutex_unlock(&mutex); //解锁
sem_post(&full); //发送一个满缓冲区信号
}
}
void *consumer(void *arg)
{
int item;
while(1)
{
sem_wait(&full); //等待满缓冲区
pthread_mutex_lock(&mutex); //加锁
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
printf("Consumed item: %d\n", item);
pthread_mutex_unlock(&mutex); //解锁
sem_post(&empty); //发送一个空缓冲区信号
}
}
int main()
{
pthread_t p1, p2, c1, c2, c3;
//初始化信号量和互斥量
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
//创建线程
pthread_create(&p1, NULL, producer, NULL);
pthread_create(&p2, NULL, producer, NULL);
pthread_create(&c1, NULL, consumer, NULL);
pthread_create(&c2, NULL, consumer, NULL);
pthread_create(&c3, NULL, consumer, NULL);
//等待线程结束
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_join(c1, NULL);
pthread_join(c2, NULL);
pthread_join(c3, NULL);
//销毁信号量和互斥量
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在上面的代码中,我们使用了两个信号量和一个互斥量来控制生产者和消费者之间的同步。empty信号量表示空缓冲区数量,当empty为0时,生产者需要等待。full信号量表示满缓冲区数量,当full为0时,消费者需要等待。mutex互斥量用于保护buffer、count、in和out这些共享变量。
当一个生产者生产一个数据时,它会将该数据放入缓冲区,并将in指针向后移动一个位置,同时增加count计数器。当一个消费者消费一个数据时,它会从缓冲区中取出一个数据,并将out指针向后移动一个位置,同时减少count计数器。
在代码中,我们使用了无限循环来模拟生产者和消费者的操作,直到程序被强制终止。在主函数中,我们创建了5个线程,包括2个生产者和3个消费者,并等待所有线程结束后销毁信号量和互斥量。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)