生产者-消费者的速度是否应该随着线程的增加而增加



我正在尝试用C++实现一个生产者-消费者问题程序。其中一个线程用不同数字的向量填充队列,而其他线程从队列中取出向量(使用条件变量/唯一锁同步(,并对向量执行简单的for循环,对数字执行一些操作。问题是,如果我使用超过2个线程,程序的速度似乎不会增加。以下是我在工作中发现的一些东西:

  • 生产者线程比消费者更快,这意味着向量的填充速度将远远快于消费者处理数据的速度
  • 处理队列中的单个矢量需要很短的时间,这意味着消费者不断地从队列中请求数据(我认为这可能是由于同步造成的瓶颈,但不确定(

在这样的程序中,是期望更多的线程会使程序更快,还是恒定的速度与线程数无关?感谢您的回答或解释!

欢迎使用Amdahl定律:https://en.wikipedia.org/wiki/Amdahl%27s_law

如果与计算相比,同步需要花费大量时间,那么就不能指望有太多的加速,因为关键部分实际上是单线程的。此外,在您的场景中,内存分配/解除分配实际上是单线程的,因为您的生产者从自己的内存领域进行分配,而消费者需要将向量解除分配到同一领域。

解决这个问题的一个好方法是增加工作项的大小。不要采用单个矢量,而是采用多个矢量。确切的规模需要一些基准测试。一个好的起点是采用ca.二级缓存大小,即累积大小约为64-256kiB的向量。

最新更新