唤醒等待位不适用于多个生产者或消费者的示例

时间:2019-01-06 18:11:48

标签: multithreading operating-system synchronization semaphore

在Andrew Tanenbaum的关于操作系统的书中,在关于消费者/生产者问题的部分中,他给出了一个示例系统,该系统由一个生产者(将数据块插入缓冲区)和消费者(将其获取,并取走数据块)组成他们离开缓冲区。另外,还有一个计数器,用于跟踪缓冲区中数据块的数量。当消费者验证计数器为零时,它进入睡眠状态。当Produces验证计数器为零并将一些数据放入缓冲区时,它将向用户发送唤醒信号。

这可能会以众所周知的方式导致赛车状况,并且Tanenbaum使用唤醒等待位提供了可能的解决方案。如果使用者仍在唤醒时收到唤醒信号,则将唤醒等待位设置为1。在睡眠之前,它会验证该位。如果为1,则会将该位减小为零,并且不会休眠。

这可以解决一个生产者和一个消费者的问题。但是Tanenbaum指出,当涉及到三个或更多生产者/消费者线程时,很容易想到一个示例,其中唤醒等待位不会阻止竞争条件。

我想不出这样的例子,关于生产者/消费者问题和信号量的所有资料似乎都避免了同一点。

有人可以提供这样一个例子,说明三个或更多个过程(最好是三个),其中唤醒等待位不能阻止赛车情况吗?

1 个答案:

答案 0 :(得分:1)

这里的明显问题是,您正在处理原始的锁定机制,而这些机制在现实生活中是没有能力的程序员会使用的。任何经过合理设计的操作系统都将具有比仅设置位和计数器还要复杂的锁定机制。

某些操作系统具有锁管理器。对于这样的队列,您可以定义一个命名的写锁。所有生产者和消费者都尝试使用独占式写锁定,并且您描述的所有机制都将根据操作系统服务来实现。