用C语言编程实现生产者-消费者问题
时间: 2024-10-21 22:17:39 浏览: 56
生产者-消费者问题是经典的问题,用于演示线程同步和互斥访问的概念。在C语言中,可以使用互斥锁(mutex)、条件变量(condition variable)等并发控制工具来解决。下面是一个简化的生产者-消费者模型的基本示例:
```c
#include <stdio.h>
#include <pthread.h>
#define BUFFER_SIZE 5
#define NUM_PRODUCERS 2
#define NUM_CONSUMERS 3
int buffer[BUFFER_SIZE] = {0};
int count = 0;
int producer_flag = 0;
int consumer_flag = 0;
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t producer_cv; // 生产者条件变量
pthread_cond_t consumer_cv; // 消费者条件变量
void *producer(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) { // 如果缓冲区满,则等待
pthread_cond_wait(&producer_cv, &mutex);
}
buffer[count++] = ++producer_flag; // 生产数据并更新计数
printf("Producer produced %d\n", producer_flag);
pthread_cond_signal(&consumer_cv); // 醒通知消费者有新的数据
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void *consumer(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) { // 如果缓冲区空,则等待
pthread_cond_wait(&consumer_cv, &mutex);
}
int data = buffer[--count]; // 消费数据并更新计数
printf("Consumer consumed %d\n", data);
pthread_cond_signal(&producer_cv); // 醒通知生产者缓冲区有空间
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t producers[NUM_PRODUCERS], consumers[NUM_CONSUMERS];
for (int i = 0; i < NUM_PRODUCERS; i++) {
pthread_create(&producers[i], NULL, producer, NULL);
}
for (int j = 0; j < NUM_CONSUMERS; j++) {
pthread_create(&consumers[j], NULL, consumer, NULL);
}
// 等待所有线程结束
for (int k = 0; k < NUM_PRODUCERS + NUM_CONSUMERS; k++) {
pthread_join(producers[k], NULL);
pthread_join(consumers[k], NULL);
}
return 0;
}
```
在这个例子中,生产者和消费者分别通过互斥锁保护对缓冲区的操作,并通过条件变量进行同步。当生产者发现缓冲区满时会等待,而消费者发现缓冲区空时也会等待。当资源可用时,相应的操作就会继续。
阅读全文