程序 main.c 模拟了 1 个生产者和 1 个消费者,请改写该程序,模拟 5 个生产者和 5 个消费者,它们共享一个包含 8 个缓冲区的缓冲池。
时间: 2024-11-15 10:33:55 浏览: 44
在C语言中,要模拟5个生产者和5个消费者共享8个缓冲区的场景,你可以使用信号量(semaphores)来控制对缓冲区的访问以及同步生产者和消费者的操作。这里提供了一个简化的示例,假设我们已经包含了必要的头文件,并定义了sem_t类型的信号量数组:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h> // 包含信号量库
#define BUFFER_COUNT 8
#define MAX_PRODUCERS 5
#define MAX_CONSUMERS 5
#define SEMAPHORE_BUFFER_AVAIL 0
#define SEMAPHORE_BUFFER_TAKEN 1
typedef struct {
int buffer[BUFFER_COUNT];
sem_t producer_semaphore; // 生产者信号量
sem_t consumer_semaphore; // 消费者信号量
} BufferPool;
void producer(BufferPool* pool, int id) {
sem_wait(&pool->producer_semaphore); // 等待可用缓冲区
pool->buffer[id] = produce_data(); // 生产数据并更新缓冲区
printf("Producer %d produced data and placed in buffer %d\n", id, id);
sem_post(&pool->consumer_semaphore); // 释放消费者信号量
}
void consumer(BufferPool* pool, int id) {
sem_wait(&pool->consumer_semaphore); // 等待有消费者需要的数据
if (pool->buffer[id] != -1) {
consume(pool->buffer[id]); // 消耗数据
pool->buffer[id] = -1; // 标记已消费
printf("Consumer %d consumed from buffer %d\n", id, id);
}
sem_post(&pool->producer_semaphore); // 通知生产者有空位
}
int main() {
BufferPool pool;
sem_init(&pool.producer_semaphore, 0, BUFFER_COUNT); // 初始化生产者信号量
sem_init(&pool.consumer_semaphore, 0, 0); // 初始化消费者信号量
for (int i = 0; i < MAX_PRODUCERS; ++i) {
// 创建生产者线程
pthread_t producer_thread;
pthread_create(&producer_thread, NULL, producer, &pool, i);
}
for (int i = 0; i < MAX_CONSUMERS; ++i) {
// 创建消费者线程
pthread_t consumer_thread;
pthread_create(&consumer_thread, NULL, consumer, &pool, i);
}
// 等待所有线程完成
for (int i = 0; i < MAX_PRODUCERS + MAX_CONSUMERS; ++i) {
pthread_join(producer_threads[i], NULL);
}
sem_destroy(&pool.producer_semaphore);
sem_destroy(&pool.consumer_semaphore);
return 0;
}
```
在这个例子中,生产者会等待消费者占用的缓冲区减少到一定的数量(等于缓冲区总数),然后才放入新的数据;而消费者会等待有新产生的数据可供消耗。这只是一个基础的框架,实际应用中可能还需要处理更多细节,如线程安全、错误处理等。
阅读全文