Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多线程不利用多核?_C++_C_Windows_Multithreading - Fatal编程技术网

C++ 多线程不利用多核?

C++ 多线程不利用多核?,c++,c,windows,multithreading,C++,C,Windows,Multithreading,我的电脑是双核core2Duo。我已经在我的应用程序的一个较慢的区域实现了多线程,但我仍然注意到cpu使用率从未超过50%,并且在多次迭代后仍然滞后。这正常吗?我希望它能让我的cpu达到100%,因为我把它分成4个线程。为什么它仍然可以被限制在50% 谢谢 看 对于我的实现,除了我修复了代码在您的描述中存在的问题外,我们没有什么可以继续的,但是,让我看看我是否可以提供帮助: 您已经实现了一个基于锁的系统,但是您没有明智地使用第二、第三或第四个线程的资源,因为它们所需要的实体一直处于锁定状态。(这

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

谢谢


对于我的实现,除了我修复了代码在您的描述中存在的问题外,我们没有什么可以继续的,但是,让我看看我是否可以提供帮助:

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

  • 首先查看这些区域。

    查看您的代码,您在紧循环中进行了大量的分配——在每次迭代中,您动态分配两个、两个元素向量,然后将它们推回到结果向量上(从而复制这两个向量);最后一次推回有时会导致矢量内容的重新分配和拷贝

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

    当然,分析会告诉您堆分配是限制了性能还是其他原因。我想提出两个具体的建议来减少堆分配:

      由于内部向量的每个实例都有两个元素,所以应该考虑使用<代码> STD::数组< /代码>(或<代码> STD::Tr1::数组< /COD>或<代码> Boo::数组< /代码>);
      数组
      “容器”对其元素不使用堆分配(它们像C数组一样存储)
    • 由于您大致知道要将多少元素放入结果向量,因此可以在插入这些元素之前为它们保留足够的空间

    您是如何“实现多线程”的?您是如何将此部分确定为应用程序中的瓶颈的?可能有点明显,但该过程是否有权使用多个核心?(签入任务管理器)是的,这是允许的,基本上我将工作分成4个部分,并在多个线程上运行我的算法,我确定了它,因为删除它会使事情变得更快。拥有多个执行线程并不一定会使应用程序更快。例如,在一个场景中,添加多个线程可能会导致性能急剧下降。所有这些问题暂时都是一个“你真的100%确定它是Core 2 Duo!!???”调用堆栈说有4个线程在运行,而且没有一个线程访问同一个元素。@user146780:我不确定如何通过查看调用堆栈计算出运行线程的数量。您愿意详细说明一下吗?我添加了一个巨大的for循环,使cpu达到100%,但是正如James McNellis刚刚告诉我的,我认为我做了太多的堆分配