C++ 多线程不利用多核?
我的电脑是双核core2Duo。我已经在我的应用程序的一个较慢的区域实现了多线程,但我仍然注意到cpu使用率从未超过50%,并且在多次迭代后仍然滞后。这正常吗?我希望它能让我的cpu达到100%,因为我把它分成4个线程。为什么它仍然可以被限制在50% 谢谢 看C++ 多线程不利用多核?,c++,c,windows,multithreading,C++,C,Windows,Multithreading,我的电脑是双核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刚刚告诉我的,我认为我做了太多的堆分配