【发布时间】:2022-01-10 09:57:29
【问题描述】:
我正在尝试用 C++ 实现一个生产者-消费者问题程序。其中一个线程用不同数字的向量填充队列,而其他线程将向量从队列中取出(使用条件变量/唯一锁同步)并在向量上执行简单的 for 循环,对数字执行一些操作。问题是,如果我使用超过 2 个线程,程序的速度似乎并没有增加。以下是我发现的一些东西:
- 生产者线程比消费者线程快,这意味着向量的填充速度将比消费者处理数据的速度快
- 处理队列中的单个向量需要很短的时间,这意味着消费者会不断地从队列中请求数据(我认为这可能是同步的瓶颈,但不确定)
在这样的程序中,是否期望更多的线程会使程序更快,或者是恒定的速度与线程数无关? 感谢您的任何回答或解释!
【问题讨论】:
-
您的 CPU 有多少个内核?如果你有 3-4 个或更少,那么无论如何你都不会获得更多的性能。
-
另外,您的同步开销听起来确实是这里的限制因素。您可以尝试进行批处理(每次使用多个向量),或者让生产者线程将工作分配给特定线程并减少锁争用。
-
还要注意 std::vector 触及堆,它自己锁定。如果这是问题,切换到恒定长度数组可能会有所帮助。但是您确实需要进行概要分析才能确定。
-
感谢所有提示。 CPU有6个核心,所以这应该不是问题。我尝试使用一个恒定长度的数组,但它并不多。批处理确实有助于提高整体时间,但不会改变超过 2 个内核根本没有区别的事实......
标签: c++ multithreading producer-consumer