在Windows系统上,用c语言解决三个消费者三个生产者十个缓冲区的问题,用一个信号量A来记录为空的缓冲区个数,另一个信号量B记录非空的缓冲区个数,然后生产者等待信号量A,消费者等待信号量B
时间: 2024-05-06 07:15:34 浏览: 73
可以使用以下代码来实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10 // 缓冲区大小
#define PRODUCER_NUM 3 // 生产者数量
#define CONSUMER_NUM 3 // 消费者数量
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0, out = 0; // 缓冲区入队和出队指针
sem_t empty, full; // 信号量
void *producer(void *arg)
{
int id = *(int *)arg;
while (1) {
// 等待空缓冲区
sem_wait(&empty);
// 生产一个产品
int item = rand() % 100;
printf("Producer %d produce item %d\n", id, item);
// 将产品放入缓冲区
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
// 发送非空缓冲区信号
sem_post(&full);
// 等待一段时间
sleep(rand() % 3);
}
return NULL;
}
void *consumer(void *arg)
{
int id = *(int *)arg;
while (1) {
// 等待非空缓冲区
sem_wait(&full);
// 从缓冲区取出一个产品
int item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer %d consume item %d\n", id, item);
// 发送空缓冲区信号
sem_post(&empty);
// 等待一段时间
sleep(rand() % 3);
}
return NULL;
}
int main()
{
// 初始化信号量
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
// 创建生产者线程
pthread_t producer_threads[PRODUCER_NUM];
int producer_ids[PRODUCER_NUM];
for (int i = 0; i < PRODUCER_NUM; i++) {
producer_ids[i] = i + 1;
pthread_create(&producer_threads[i], NULL, producer, &producer_ids[i]);
}
// 创建消费者线程
pthread_t consumer_threads[CONSUMER_NUM];
int consumer_ids[CONSUMER_NUM];
for (int i = 0; i < CONSUMER_NUM; i++) {
consumer_ids[i] = i + 1;
pthread_create(&consumer_threads[i], NULL, consumer, &consumer_ids[i]);
}
// 等待线程结束
for (int i = 0; i < PRODUCER_NUM; i++) {
pthread_join(producer_threads[i], NULL);
}
for (int i = 0; i < CONSUMER_NUM; i++) {
pthread_join(consumer_threads[i], NULL);
}
// 销毁信号量
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
```
在这个程序中,我们使用了两个信号量 `empty` 和 `full` 来实现缓冲区的同步。`empty` 记录空缓冲区的数量,`full` 记录非空缓冲区的数量。每个生产者在生产一个产品之前会等待 `empty` 信号量,如果没有空缓冲区可用,则会阻塞等待。当生产者放入一个产品后,会发送一个 `full` 信号量,表示有一个非空缓冲区可用。每个消费者在消费一个产品之前会等待 `full` 信号量,如果没有非空缓冲区可用,则会阻塞等待。当消费者取走一个产品后,会发送一个 `empty` 信号量,表示有一个空缓冲区可用。
阅读全文