T47 同步互斥 生产者消费者模型 (消费者必须连续取出)
其实和正常的消费者生产这一样,不过所有消费者共享一个取锁, 获得锁后需要连续取出 件后释放锁。
semaphore mutex = 1; // 互斥锁
semaphore mutex_buffer = 1; // 缓冲区读写互斥锁
semaphore full = 0; // 已用缓冲区计数
semaphore empty = N; // 空缓冲区计数
process Producer {
while (true) {
wait(empty);
wait(mutex_buffer);
// 将产品放入缓冲区
signal(mutex_buffer);
signal(full);
}
}
process Consumer {
while (true) {
wait(mutex); // 获取取锁
for (i = 0; i < n; i++) {
wait(full);
wait(mutex_buffer);
// 从缓冲区取出产品
signal(mutex_buffer);
signal(empty);
}
signal(mutex);
}
}