关于生产者-消费者问题的经典算法我不明白的东西(来自维基百科:)
信号量互斥量 = 1 信号量填充计数 = 0 信号量 emptyCount = BUFFER_SIZE 程序生产者(){ 而(真){ 项目 = 生产项目() 向下(空计数) 向下(互斥体) putItemIntoBuffer(项目) 向上(互斥体) 向上(填充计数) } up(fillCount) //消费者可能不会在生产者之前完成。 } 过程消费者(){ 而(真){ 向下(填充计数) 向下(互斥体) item = removeItemFromBuffer() 向上(互斥体) 向上(空计数) 消费项目(项目) } }
我注意到生产者和消费者都在弄乱缓冲区之前锁定“互斥锁”,然后再解锁它。如果是这种情况,即在任何给定时刻只有一个线程正在访问缓冲区,我真的看不出上述算法与只需要在缓冲区上放置一个保护互斥锁的简单解决方案有何不同:
信号量互斥量 = 1 程序生产者(){ 而(真){ 项目 = 生产项目() 标志 = 真 而(标志){ 向下(互斥体) 如果(缓冲区未满()){ putItemIntoBuffer(项目) 标志 = 假 } 向上(互斥体) } } } 过程消费者(){ 而(真){ 标志 = 真 而(标志){ 向下(互斥体) if (bufferNotEmpty()) { item = removeItemFromBuffer() 标志 = 假 } 向上(互斥体) } 消费项目(项目) } }
我能想到的唯一需要使用“fillCount”和“emptyCount”信号量的就是调度。
也许第一个算法是为了确保在 5 个消费者正在等待一个空缓冲区(零'fillCount')的状态下,可以确保当一个新的生产者出现时,它将超过它的“down(emptyCount)”快速声明并快速获取“互斥锁”。
(而在另一种解决方案中,消费者将不必要地获得“互斥体”,只是为了放弃它,直到新的生产者获得它并插入一个项目)。
我对吗?我错过了什么吗?