c语言实现操作系统中消费者与生产者之间的关系
时间: 2024-02-05 14:04:35 浏览: 22
在操作系统中,生产者与消费者问题是一个经典的同步问题,通常用于描述多个进程之间的协作。下面是一个使用 C 语言实现的生产者与消费者问题:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_BUFFER_SIZE 10
int buffer[MAX_BUFFER_SIZE]; // 缓冲区数组
int count = 0; // 缓冲区计数器
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t producer_cond = PTHREAD_COND_INITIALIZER; // 生产者条件变量
pthread_cond_t consumer_cond = PTHREAD_COND_INITIALIZER; // 消费者条件变量
// 生产者线程函数
void *producer(void *arg)
{
int i, data;
for (i = 0; i < MAX_BUFFER_SIZE; i++)
{
data = rand()%100; // 产生随机数作为生产的数据
pthread_mutex_lock(&mutex); // 加锁
while (count == MAX_BUFFER_SIZE) // 如果缓冲区满了,等待消费者消费
{
printf("producer is waiting...\n");
pthread_cond_wait(&producer_cond, &mutex);
}
buffer[count++] = data; // 将数据放入缓冲区
printf("producer produce data %d\n", data);
pthread_cond_signal(&consumer_cond); // 通知消费者可以消费数据了
pthread_mutex_unlock(&mutex); // 解锁
}
pthread_exit(NULL);
}
// 消费者线程函数
void *consumer(void *arg)
{
int i, data;
for (i = 0; i < MAX_BUFFER_SIZE; i++)
{
pthread_mutex_lock(&mutex); // 加锁
while (count == 0) // 如果缓冲区为空,等待生产者生产
{
printf("consumer is waiting...\n");
pthread_cond_wait(&consumer_cond, &mutex);
}
data = buffer[--count]; // 从缓冲区取出一个数据
printf("consumer consume data %d\n", data);
pthread_cond_signal(&producer_cond); // 通知生产者可以生产数据了
pthread_mutex_unlock(&mutex); // 解锁
}
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
pthread_t producer_thread, consumer_thread;
srand((unsigned)time(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);
return 0;
}
```
代码中使用了一个数组作为缓冲区,互斥锁和条件变量来控制生产者和消费者的同步。生产者线程不断地往缓冲区中添加数据,如果缓冲区已满则等待消费者消费;消费者线程不断地从缓冲区中取出数据,如果缓冲区为空则等待生产者生产。通过互斥锁和条件变量的配合,保证了生产者和消费者之间的同步和互斥。