gpt4 book ai didi

多线程:经典的生产者消费者算法

转载 作者:行者123 更新时间:2023-12-01 06:14:38 31 4
gpt4 key购买 nike

关于生产者-消费者问题的经典算法,我不明白的事情(来自维基百科:)

semaphore mutex = 1semaphore fillCount = 0semaphore emptyCount = BUFFER_SIZEprocedure producer() {    while (true) {        item = produceItem()        down(emptyCount)            down(mutex)                putItemIntoBuffer(item)            up(mutex)        up(fillCount)    }    up(fillCount) //the consumer may not finish before the producer.}procedure consumer() {    while (true) {        down(fillCount)            down(mutex)                item = removeItemFromBuffer()            up(mutex)        up(emptyCount)        consumeItem(item)    }}

我注意到,生产者和消费者在弄乱缓冲区之前都会锁定“互斥体”,然后再将其解锁。如果是这种情况,即在任何给定时刻只有一个线程正在访问缓冲区,我真的看不出上述算法与仅需要在缓冲区上放置一个保护互斥锁的简单解决方案有何不同:

semaphore mutex = 1procedure producer() {    while (true) {        item = produceItem()        flag = true        while (flag) {            down(mutex)            if (bufferNotFull()) {                putItemIntoBuffer(item)                flag = false            }            up(mutex)        }    }}procedure consumer() {    while (true) {        flag = true        while (flag) {            down(mutex)            if (bufferNotEmpty()) {                item = removeItemFromBuffer()                flag = false            }            up(mutex)        }        consumeItem(item)    }}

我能想到的唯一需要使用“fillCount”和“emptyCount”信号量的是调度

也许第一个算法是为了确保在 5 个消费者正在等待空缓冲区(零“fillCount”)的状态下,可以确保当新的生产者出现时,它将超过其“down( emptyCount)”语句快速获取‘互斥体’。

(而在另一个解决方案中,消费者将不必要地获取“互斥体”,只是为了放弃它,直到新的生产者获取它并插入一个项目)。

我说得对吗?我错过了什么吗?

最佳答案

如果缓冲区中没有消息,消费者将降低互斥体,检查缓冲区,发现它是空的,增加互斥体,循环并立即重复该过程。简单来说,消费者和生产者陷入了占用 100% CPU 核心的繁忙循环中。这也不仅仅是一个理论问题。您可能会发现每次运行程序时计算机的风扇都会开始旋转。

关于多线程:经典的生产者消费者算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4058594/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com