gpt4 book ai didi

multithreading - 多生产者/单消费者模型中的最佳 sleep 时间

转载 作者:行者123 更新时间:2023-12-03 12:57:57 24 4
gpt4 key购买 nike

我正在编写一个具有多个生产者、单个消费者模型的应用程序(多个线程将消息发送到单个文件编写器线程)。

每个生产者线程包含两个队列,一个用于写入,一个用于消费者读取。消费者线程的每个循环,它遍历每个生产者并锁定该生产者的互斥锁、交换队列、解锁并从生产者不再使用的队列中写出。

在消费者线程的循环中,它在处理完所有生产者线程后休眠指定的时间。我立即注意到的一件事是,当我从 1 个生产者线程移动到 2 个生产者线程时,生产者将内容写入队列并返回的平均时间显着增加(5 倍)。随着添加更多线程,该平均时间会减少,直到它触底out - 10 个生产者和 15 个生产者所花费的时间没有太大区别。这大概是因为要处理的生产者越多,生产者线程的互斥锁的争用就越少。

不幸的是,对于应用程序来说,拥有 < 5 个生产者是一个相当常见的场景,我想优化 sleep 时间,以便无论存在多少生产者都能获得合理的性能。我注意到,通过增加 sleep 时间,我可以在生产者数量较少的情况下获得更好的性能,但在生产者数量较多的情况下性能会更差。

有没有其他人遇到过这种情况,如果有,您的解决方案是什么?我试过用线程数来调整 sleep 时间,但它似乎有点特定于机器并且非常反复试验。

最佳答案

您可以根据生产者的数量选择 sleep 时间,甚至可以根据一些动态方案调整 sleep 时间。如果消费者醒来没有工作,则将 sleep 时间加倍,否则减半。但是将 sleep 时间限制在某个最小值和最大值。

无论哪种方式,您都在掩盖一个更基本的问题。休眠和轮询很容易正确,有时是唯一可用的方法,但它有很多缺点,并不是“正确”的方法。

您可以通过添加一个信号量来朝着正确的方向前进,该信号量在生产者将项目添加到队列时递增,并在消费者处理队列中的项目时递减。消费者只有在有物品需要处理时才会醒来,并且会立即处理。

不过,轮询队列可能仍然是一个问题。您可以添加一个新队列,该队列引用任何包含项目的队列。但这反而引发了一个问题,即为什么没有消费者处理的单个队列而不是每个生产者的队列。在其他条件相同的情况下,这听起来是最好的方法。

关于multithreading - 多生产者/单消费者模型中的最佳 sleep 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1400605/

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