C语言实现消费者与生产者之间的问题
时间: 2024-09-09 07:03:38 浏览: 38
C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计
5星 · 资源好评率100%
在C语言中,消费者与生产者问题是一个经典的并发控制问题,通常通过互斥量(mutexes)、条件变量(condition variables)等同步原语来解决。这个模型描述了两个线程角色:生产者负责生成数据放入缓冲区,而消费者负责从缓冲区读取并处理数据。以下是简单的C代码示例:
```c
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE] = {0};
int count = 0;
int in_use = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* producer(void* arg) {
while (1) {
int data = rand() % 100; // 假设生产随机数
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE || !in_use) {
pthread_cond_wait(&cond, &mutex); // 等待消费者处理完
}
buffer[in_use++] = data;
printf("Produced: %d\n", data);
count++;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* consumer(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0 || in_use == BUFFER_SIZE) {
pthread_cond_wait(&cond, &mutex); // 等待生产者填充
}
in_use--;
int data = buffer[in_use];
printf("Consumed: %d\n", data);
count--;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
if (pthread_create(&producer_thread, NULL, producer, NULL) != 0 ||
pthread_create(&consumer_thread, NULL, consumer, NULL) != 0) {
perror("Error creating threads");
exit(1);
}
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
在这个例子中,`producer`和`consumer`函数分别代表生产者和消费者线程。它们通过互斥锁和条件变量协作,确保任何时候只有一个线程可以访问缓冲区。当生产者试图添加到满的缓冲区时,它会等待;同样,当消费者试图从空的缓冲区读取时,它也会等待。
阅读全文