使用C语言,通过生产者-消费者问题实现一个系统动态分配资源的简单模拟程序
时间: 2024-02-11 11:09:57 浏览: 114
生产者-消费者问题是一个经典的同步问题,可以用于模拟系统动态分配资源的过程。下面是一个使用 C 语言实现的简单模拟程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX 100
#define N 10
int buffer[MAX]; // 缓冲区
int in = 0, out = 0; // 缓冲区指针
sem_t empty, full; // 信号量
void *producer(void *arg) // 生产者线程
{
int i, item;
for (i = 0; i < N; i++) {
item = rand() % 1000; // 产生一个随机数作为生产的物品
sem_wait(&empty); // 等待空缓冲区
buffer[in] = item; // 将物品放入缓冲区
printf("Producer %d produced item %d at position %d\n", *(int *)arg, item, in);
in = (in + 1) % MAX; // 缓冲区指针加一
sem_post(&full); // 发信号表示缓冲区已满
}
pthread_exit(NULL);
}
void *consumer(void *arg) // 消费者线程
{
int i, item;
for (i = 0; i < N; i++) {
sem_wait(&full); // 等待满缓冲区
item = buffer[out]; // 从缓冲区取出物品
printf("Consumer %d consumed item %d at position %d\n", *(int *)arg, item, out);
out = (out + 1) % MAX; // 缓冲区指针加一
sem_post(&empty); // 发信号表示缓冲区已空
}
pthread_exit(NULL);
}
int main()
{
int i;
pthread_t prod_threads[N], cons_threads[N];
int prod_id[N], cons_id[N];
sem_init(&empty, 0, MAX); // 初始化空缓冲区信号量
sem_init(&full, 0, 0); // 初始化满缓冲区信号量
// 创建生产者线程
for (i = 0; i < N; i++) {
prod_id[i] = i;
pthread_create(&prod_threads[i], NULL, producer, &prod_id[i]);
}
// 创建消费者线程
for (i = 0; i < N; i++) {
cons_id[i] = i;
pthread_create(&cons_threads[i], NULL, consumer, &cons_id[i]);
}
// 等待所有线程结束
for (i = 0; i < N; i++) {
pthread_join(prod_threads[i], NULL);
pthread_join(cons_threads[i], NULL);
}
sem_destroy(&empty); // 销毁空缓冲区信号量
sem_destroy(&full); // 销毁满缓冲区信号量
pthread_exit(NULL); // 退出主线程
}
```
上述程序中,定义了一个长度为 MAX 的缓冲区 buffer,in 和 out 分别表示缓冲区的读写指针,empty 和 full 分别表示缓冲区为空和满的信号量。程序中创建了 N 个生产者线程和 N 个消费者线程,每个生产者线程随机生成一个物品并放入缓冲区,每个消费者线程从缓冲区中取出一个物品并消耗。通过信号量的等待和发送操作来实现生产者和消费者之间的同步。
以上程序仅为一个简单的模拟程序,实际应用中需要根据具体需求进行修改和扩展。
阅读全文