生产者消费者问题(Producer-Consumer Problem)通常用于多线程编程中的线程间通信和同步。
题目:
解析:
empty full
Semaphore empty = 1; Semaphore full = 0;
流程图演示:
// 信号量初始化
Semaphore empty = 1; // 缓冲区空闲单元数量
Semaphore full = 0; // 缓冲区已占用单元数量
Buffer buffer; // 缓冲区
// 生产者线程
void producer() {
while (true) {
// 生产一个数据项
item = produceItem();
// 等待缓冲区有空闲单元
P(empty);
// 将数据项放入缓冲区
buffer = item;
// 通知消费者缓冲区中有数据
V(full);
}
}
// 消费者线程
void consumer() {
while (true) {
// 等待缓冲区有数据
P(full);
// 从缓冲区中取出数据项
item = buffer;
// 通知生产者缓冲区中有一个空闲单元
V(empty);
// 消费数据项
consumeItem(item);
}
}
题目:
主干部分解析:
empty full
Semaphore empty = 1; Semaphore full = 0;
改动部分解析:
Buffer[n] buffer;
in out
(in/out+1)%n
实现了循环 流程图演示:
// 信号量初始化
Semaphore empty = n; // 缓冲区空闲单元数量,初始为n
Semaphore full = 0; // 缓冲区已占用单元数量
Buffer[n] buffer; // 大小为n的缓冲区数组
int in = 0; // 指向下一个空闲缓冲区的索引(生产者使用)
int out = 0; // 指向下一个有数据缓冲区的索引(消费者使用)
// 生产者线程
void producer() {
while (true) {
// 生产一个数据项
item = produceItem();
// 等待缓冲区有空闲单元
P(empty);
// 将数据项放入缓冲区
buffer[in] = item;
in = (in + 1) % n; // 循环使用缓冲区
// 通知消费者缓冲区中有数据
V(full);
}
}
// 消费者线程
void consumer() {
while (true) {
// 等待缓冲区有数据
P(full);
// 从缓冲区中取出数据项
item = buffer[out];
out = (out + 1) % n; // 循环使用缓冲区
// 通知生产者缓冲区中有一个空闲单元
V(empty);
// 消费数据项
consumeItem(item);
}
}