编写c程序模拟实现生产者-消费者问题
时间: 2023-06-11 22:05:08 浏览: 212
好的,我可以为您提供一个简单的 C 语言程序模拟生产者-消费者问题的实现。以下是代码示例:
```
#include <stdio.h>
#define BUFFER_SIZE 5 // 缓冲区大小
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 生产者向缓冲区中写入数据的位置
int out = 0; // 消费者从缓冲区中取出数据的位置
int count = 0; // 缓冲区中剩余数据的数量
void produce(int item) {
buffer[in] = item; // 写入数据到缓冲区
in = (in + 1) % BUFFER_SIZE; // 移动写指针
count++; // 增加缓冲区中剩余数据数量
}
int consume() {
int item = buffer[out]; // 从缓冲区读取数据
out = (out + 1) % BUFFER_SIZE; // 移动读指针
count--; // 减少缓冲区中剩余数据数量
return item;
}
void *producer(void *arg) {
int item;
while (1) {
item = produce_item(); // 生产数据
if (count == BUFFER_SIZE) // 缓冲区已满
sleep(); // 等待消费者唤醒
produce(item); // 将数据写入缓冲区
if (count == 1) // 缓冲区原来为空
wakeup(consumer); // 唤醒消费者
}
}
void *consumer(void *arg) {
int item;
while (1) {
if (count == 0) // 缓冲区为空
sleep(); // 等待生产者唤醒
item = consume(); // 从缓冲区中取出数据
if (count == BUFFER_SIZE - 1) // 缓冲区原来为满
wakeup(producer); // 唤醒生产者
consume_item(item); // 处理数据
}
}
int main() {
pthread_t producer_thread, consumer_thread;
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;
}
```
这个程序中包含了生产者和消费者两个线程,它们共享一个固定大小的缓冲区。生产者线程负责生产数据并将其写入缓冲区,而消费者线程负责从缓冲区中读取数据并进行处理。缓冲区的读写需要使用锁或者信号量来进行同步控制,以避免出现竞态条件的问题。
阅读全文