操作系统生产者与消费者代码实现C语言
时间: 2024-09-10 22:01:45 浏览: 40
在操作系统中,生产者-消费者问题是一个经典的同步问题,用来描述在共享资源的生产与消费过程中,如何进行有效的线程协作。生产者负责生成数据放到缓冲区,消费者从缓冲区取出数据消费。为了防止生产者在缓冲区满时继续生产,以及防止消费者在缓冲区空时尝试消费,需要通过同步机制来解决这种资源访问的冲突。
以下是使用C语言实现生产者-消费者问题的一个基本示例,使用了互斥锁(mutex)和条件变量(condition variable)来控制对共享缓冲区的访问。
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define BUFFER_SIZE 10 // 缓冲区大小
// 定义缓冲区和相关操作的结构体
typedef struct {
int buffer[BUFFER_SIZE];
int count; // 缓冲区中数据的数量
int in; // 下一个放入数据的位置
int out; // 下一个取出数据的位置
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t can_produce; // 可以生产的条件变量
pthread_cond_t can_consume; // 可以消费的条件变量
} buffer_t;
buffer_t buffer = {0, 0, 0, 0, PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER};
// 生产者函数
void* producer(void* arg) {
while (1) {
pthread_mutex_lock(&buffer.mutex);
// 等待消费者消费掉一些数据
while (buffer.count == BUFFER_SIZE) {
pthread_cond_wait(&buffer.can_produce, &buffer.mutex);
}
// 生产数据
int value = rand() % 100;
buffer.buffer[buffer.in] = value;
buffer.in = (buffer.in + 1) % BUFFER_SIZE;
buffer.count++;
printf("Produced: %d\n", value);
pthread_cond_signal(&buffer.can_consume); // 通知消费者有数据可消费
pthread_mutex_unlock(&buffer.mutex);
sleep(1);
}
}
// 消费者函数
void* consumer(void* arg) {
while (1) {
pthread_mutex_lock(&buffer.mutex);
// 等待生产者生产一些数据
while (buffer.count == 0) {
pthread_cond_wait(&buffer.can_consume, &buffer.mutex);
}
// 消费数据
int value = buffer.buffer[buffer.out];
buffer.out = (buffer.out + 1) % BUFFER_SIZE;
buffer.count--;
printf("Consumed: %d\n", value);
pthread_cond_signal(&buffer.can_produce); // 通知生产者有空间可以生产
pthread_mutex_unlock(&buffer.mutex);
sleep(1);
}
}
int main() {
pthread_t prod, cons;
// 创建生产者和消费者线程
pthread_create(&prod, NULL, producer, NULL);
pthread_create(&cons, NULL, consumer, NULL);
pthread_join(prod, NULL); // 等待线程结束(在实际应用中不应该这样做,这里仅为了示例)
pthread_join(cons, NULL); // 等待线程结束(在实际应用中不应该这样做,这里仅为了示例)
return 0;
}
```
在这个示例中,生产者和消费者通过互斥锁`mutex`来确保缓冲区访问的互斥,通过条件变量`can_produce`和`can_consume`来等待和通知对方的状态变化。生产者在缓冲区满时等待,消费者在缓冲区空时等待。当生产者生产了数据后,会通知消费者可以消费;反之,当消费者消费了数据后,也会通知生产者可以继续生产。
阅读全文