C语言实现生产者消费者问题,简易代码,并注释
时间: 2024-01-31 07:03:48 浏览: 83
好的,以下是一个简易的C语言代码实现生产者消费者问题,附有注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 缓冲区大小
#define BUFFER_SIZE 10
// 缓冲区
int buffer[BUFFER_SIZE];
// 缓冲区中元素数量
int count = 0;
// 互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 条件变量,用于生产者和消费者之间的同步
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
// 生产者线程函数
void *producer(void *arg) {
int i = 0;
while (i < 20) { // 生产20个元素
pthread_mutex_lock(&mutex); // 加锁
// 如果缓冲区已满,则等待
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
// 生产一个元素,放入缓冲区
buffer[count++] = i;
printf("Producing %d...\n", i);
// 发出条件信号,唤醒等待在full条件变量上的消费者线程
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex); // 解锁
i++;
}
return NULL;
}
// 消费者线程函数
void *consumer(void *arg) {
int i = 0;
while (i < 20) { // 消费20个元素
pthread_mutex_lock(&mutex); // 加锁
// 如果缓冲区为空,则等待
while (count == 0) {
pthread_cond_wait(&full, &mutex);
}
// 从缓冲区中取出一个元素进行消费
int item = buffer[--count];
printf("Consuming %d...\n", item);
// 发出条件信号,唤醒等待在empty条件变量上的生产者线程
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex); // 解锁
i++;
}
return NULL;
}
int main() {
pthread_t p, c;
// 创建生产者和消费者线程
pthread_create(&p, NULL, producer, NULL);
pthread_create(&c, NULL, consumer, NULL);
// 等待线程结束
pthread_join(p, NULL);
pthread_join(c, NULL);
return 0;
}
```
该代码实现了一个简单的生产者消费者模型,使用了互斥锁和条件变量来实现线程之间的同步与互斥。生产者线程不断生产元素并将其放入缓冲区,而消费者线程不断从缓冲区中取出元素进行消费。当缓冲区已满时,生产者线程会等待,直到有消费者取出元素后才会继续生产;当缓冲区为空时,消费者线程会等待,直到有生产者生产元素后才会继续消费。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.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)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)