(1)编程实现生产者-消费者问题的模拟(建议用C语言编写源代码)。 基本要求: (1)生产者消费者对缓冲区进行互斥操作。 (2)缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 (3)生产者消费者各循环操作10次
时间: 2023-05-25 10:06:40 浏览: 294
以下是基于C语言的生产者-消费者问题的模拟代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10 // 缓冲区大小
sem_t empty; // 空缓冲区信号量
sem_t full; // 满缓冲区信号量
pthread_mutex_t mutex; // 互斥锁
int buffer[BUFFER_SIZE]; // 缓冲区数组
int in = 0; // 生产者放置数据的位置
int out = 0; // 消费者取走数据的位置
void *producer(void *param)
{
int item, i;
for(i = 0; i < 10; i++) {
item = rand() % 100; // 生产一个随机数
sem_wait(&empty); // 等待空缓冲区
pthread_mutex_lock(&mutex); // 申请互斥锁
buffer[in] = item; // 将item放入缓冲区
printf("生产者生产一个数据:%d\n", item);
in = (in + 1) % BUFFER_SIZE; // 更新in的值
pthread_mutex_unlock(&mutex); // 释放互斥锁
sem_post(&full); // 发布满缓冲区
}
pthread_exit(0);
}
void *consumer(void *param)
{
int item, i;
for(i = 0; i < 10; i++) {
sem_wait(&full); // 等待满缓冲区
pthread_mutex_lock(&mutex); // 申请互斥锁
item = buffer[out]; // 从缓冲区取出数据
printf("消费者消费一个数据:%d\n", item);
out = (out + 1) % BUFFER_SIZE; // 更新out的值
pthread_mutex_unlock(&mutex); // 释放互斥锁
sem_post(&empty); // 发布空缓冲区
}
pthread_exit(0);
}
int main()
{
pthread_t producer_thread, consumer_thread; // 生产者、消费者线程
sem_init(&empty, 0, BUFFER_SIZE); // 初始化空缓冲区信号量
sem_init(&full, 0, 0); // 初始化满缓冲区信号量
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
pthread_create(&producer_thread, NULL, producer, NULL); // 创建生产者线程
pthread_create(&consumer_thread, NULL, consumer, NULL); // 创建消费者线程
pthread_join(producer_thread, NULL); // 等待生产者线程结束
pthread_join(consumer_thread, NULL); // 等待消费者线程结束
sem_destroy(&empty); // 销毁空缓冲区信号量
sem_destroy(&full); // 销毁满缓冲区信号量
pthread_mutex_destroy(&mutex); // 销毁互斥锁
return 0;
}
```
这是一个简单的生产者-消费者问题的模拟程序,其中缓冲区大小为10,并使用了信号量和互斥锁来实现生产者消费者对缓冲区的互斥操作。同时,生产者和消费者各循环操作10次。在生产者线程中,每次生成一个随机数,并将其放入缓冲区中;而在消费者线程中,则每次从缓冲区中取出一个数据并进行消费。由于采用了信号量和互斥锁的机制,因此保证了生产者与消费者对缓冲区互斥使用的情况。
阅读全文