多线程没有利用多核?

时间:2010-07-07 01:39:04

标签: c++ c windows multithreading

我的电脑是双核core2Duo。我已经在我的应用程序的缓慢区域中实现了多线程,但我仍然注意到cpu的使用率从未超过50%,并且在多次迭代后仍然滞后。这是正常的吗?我希望它能让我的cpu达到100%,因为我将它分成4个线程。为什么它仍然可以限制在50%?

由于

请参阅What am I doing wrong? (multithreading)

我的实现,除了我修复了该代码有

的问题

2 个答案:

答案 0 :(得分:1)

根据您的描述,我们很少继续,但是,让我看看我是否可以提供帮助:

  1. 您已经实现了一个基于锁的系统,但是您并没有明智地使用第二个,第三个或第四个线程的资源,因为它们所需的实体经常被锁定。 (这是我首先要研究的一个非常真实和明显的领域)
  2. 您实际上并没有使用多个线程。不知何故,在某个地方,那些其他线程甚至没有被启动或初始化。 (听起来很愚蠢,但我之前已经这样做了)
  3. 首先研究这些方面。

答案 1 :(得分:1)

查看你的代码,你在紧密的循环中进行大量的分配 - 在每次迭代中你动态分配两个双元素向量,然后将它们推回到结果向量上(从而制作两者的副本)那些载体);最后一次推回会偶尔导致重新分配和矢量内容的副本。

即使您的实现对小块使用快速,固定大小的分配器,堆分配也相对较慢。在最坏的情况下,通用分配器甚至可以使用全局锁;如果是这样,它将消除你可能从多线程获得的任何收益,因为每个线程将花费大量时间等待堆分配。

当然,分析会告诉您堆分配是否会限制您的性能,或者它是否是其他东西。我会提出两个具体建议来减少你的堆分配:

  • 由于内部向量的每个实例都有两个元素,因此您应该考虑使用std::array(或std::tr1::arrayboost::array); array“容器”不对其元素使用堆分配(它们像C数组一样存储)。
  • 由于您大致知道要将多少元素添加到结果向量中,因此在插入之前,reserve()可以为这些元素留出足够的空间。