用C语言编写生产者消费者程序并解析
时间: 2024-09-24 21:31:18 浏览: 66
在C语言中,我们可以使用互斥锁(mutex)、条件变量(condition variable)等同步原语来编写生产者消费者(Producer-Consumer)程序。这是一种经典的问题,通常用于演示并发控制和线程同步机制。
下面是一个简单的示例,展示了一个共享缓冲区,生产者负责填充缓冲区,消费者负责消费:
```c
#include <pthread.h>
#include <stdio.h>
#define BUFFER_SIZE 5
#define MAX_ITEMS 10
typedef struct {
int buffer[BUFFER_SIZE];
int count;
int capacity;
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t empty; // 条件变量,当缓冲区空时唤醒消费者
pthread_cond_t full; // 条件变量,当缓冲区满时唤醒生产者
} producer_consumer;
producer_consumer pc = { .buffer = {}, .count = 0, .capacity = BUFFER_SIZE };
void* producer(void* arg) {
while (pc.count < MAX_ITEMS) {
pthread_mutex_lock(&pc.mutex);
if (pc.count == pc.capacity) {
printf("Producer waiting for space...\n");
pthread_cond_wait(&pc.full, &pc.mutex); // 阻塞直到缓冲区不满
}
pc.buffer[pc.count] = pc.count++;
printf("Produced item %d\n", pc.count);
pthread_mutex_unlock(&pc.mutex);
// 模拟生产过程的延迟,这里是实际应用中的异步操作
sleep(1);
}
return NULL;
}
void* consumer(void* arg) {
while (pc.count > 0) {
pthread_mutex_lock(&pc.mutex);
if (pc.count == 0) {
printf("Consumer waiting for items...\n");
pthread_cond_wait(&pc.empty, &pc.mutex); // 阻塞直到缓冲区非空
}
pc.count--;
printf("Consumed item %d\n", pc.count);
pthread_mutex_unlock(&pc.mutex);
// 模拟消费过程的延迟
sleep(1);
}
printf("All items consumed.\n");
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
在这个例子中,生产者和消费者分别在一个单独的线程中运行,通过互斥锁和条件变量协调它们的行为。生产者检查缓冲区是否已满,如果满了则等待;消费者检查是否有物品可供消费,如果没有则等待。这展示了如何处理资源的竞争和同步。
阅读全文