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);
    }
}