利用记录型信号量解决生产者消费者问题显示缓冲区完整代码
时间: 2023-11-12 16:03:38 浏览: 96
以下是使用记录型信号量解决生产者消费者问题的缓冲区完整代码,其中缓冲区大小为5:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
sem_t empty, full;
pthread_mutex_t mutex;
void *producer(void *arg) {
int item;
while (1) {
item = rand() % 100;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
printf("Producer produced item %d\n", item);
buffer[(int)arg] = item;
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void *consumer(void *arg) {
int item;
while (1) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[(int)arg];
buffer[(int)arg] = -1;
printf("Consumer consumed item %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
}
int main() {
pthread_t producer_threads[BUFFER_SIZE], consumer_threads[BUFFER_SIZE];
int i;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
for (i = 0; i < BUFFER_SIZE; i++) {
buffer[i] = -1;
pthread_create(&producer_threads[i], NULL, producer, (void *)i);
pthread_create(&consumer_threads[i], NULL, consumer, (void *)i);
}
for (i = 0; i < BUFFER_SIZE; i++) {
pthread_join(producer_threads[i], NULL);
pthread_join(consumer_threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
```
在该代码中,我们使用了两个信号量 `empty` 和 `full`,以及一个互斥量 `mutex`。`empty` 表示缓冲区中可用的空间数量,初始值为缓冲区大小;`full` 表示缓冲区中已有的数据数量,初始值为0。在生产者线程中,我们先使用 `sem_wait()` 函数将 `empty` 信号量减1,表示有一个空间被占用;然后使用互斥量 `mutex` 保护共享变量 `buffer`,将一个随机数作为生产的数据存入缓冲区中;最后使用 `sem_post()` 函数将 `full` 信号量加1,表示有一个数据被生产出来了。在消费者线程中,我们先使用 `sem_wait()` 函数将 `full` 信号量减1,表示有一个数据可被消费;然后使用互斥量 `mutex` 保护共享变量 `buffer`,将缓冲区中的数据取出并清空;最后使用 `sem_post()` 函数将 `empty` 信号量加1,表示有一个空间被释放出来了。
在 `main()` 函数中,我们创建了多个生产者和消费者线程,并等待它们的结束。最后,我们销毁了使用的信号量和互斥量。
阅读全文