将多线程合并到 C++ 中如何提高性能,为啥?

Posted

技术标签:

【中文标题】将多线程合并到 C++ 中如何提高性能,为啥?【英文标题】:How does incorporating multi-threading into C++ benefit the performance, and why?将多线程合并到 C++ 中如何提高性能,为什么? 【发布时间】:2020-08-11 15:39:17 【问题描述】:

我了解到多线程是指程序的两个或多个部分可以同时运行,但使用多线程的实际目的是什么?为什么以及如何对我们计划的绩效有好处?

【问题讨论】:

我可以访问128台核心机器。如果我的程序只使用其中一个,我的 CFO 不会对我满意。如果要使用其他127,则需要采用多线程模型。 它对性能有什么好处?通常,我在做酱汁的同时煮意大利面。这样,我可以更快地吃饭。按顺序做会让我饿得更久。 @Bathsheba 从技术上讲,多处理也可以。 @StoryTeller-UnslanderMonica 或者(在我的情况下更有可能)最终吃到煮过头的意大利面:( @SergeyA - 您是否考虑过您可能使用了错误的同步机制? ;) 【参考方案1】:

如果我有一个包含 10000 个项目的列表,每个项目都需要进行操作。如果我在 10000 个项目上使用单个线程进行此操作,假设它需要 8 秒。如果我在 4 核 CPU 上使用多线程进行此操作,这意味着我可以将操作划分为 4 个线程,操作的成本现在将是运行项目的四分之一的成本,即 2500。现在花费的时间大约需要 2 秒。因为每个线程都在 2500 个项目上独立运行,这些项目构成 10000 个项目。这样,多线程可以加快您的计算速度。我没有考虑设置线程的成本。

多线程的另一个用途是避免需要很长时间才能返回的线程阻塞调用。例如 TCP 套接字编程中的接受和连接。您可以旋转一个新线程来处理它,不是为了速度,而是为了确保主线程不被阻塞。

【讨论】:

这假设操作系统将在每个内核上运行一个线程。无法保证操作系统会在每个内核上运行一个线程。最坏的情况是,您有更多任务共享一个内核。 @ThomasMatthews,如果它允许任何 CPU 在准备运行的线程等待时保持空闲任何相当长的时间,这将是一个不寻常的操作系统或操作系统的不寻常配置运行队列。 我不是说保持核心空闲;运行其他应用程序的内核。例如,一个内核可以播放音乐,另一个内核进行 Internet I/O 等。因此,更糟糕的情况是,其他内核将忙于更高优先级的线程或任务。 @ThomasMatthews,当然,但在讨论某些计算密集型应用程序的性能时,习惯上假设整个硬件平台(或某些明确定义的部分)其中)是为应用程序保留的,除非有人明确说明。【参考方案2】:

多线程的实际目的无非就是你所说的:它是一种让程序的两个或多个部分同时运行的方法。

您可能希望同一程序的两个或多个部分同时运行的原因有很多。 其中一个原因是,这是一种利用多处理器计算机系统的多个 CPU 的方法:如果将不同的并发线程分配给不同的 CPU,则它们可以执行 in parallel with each other。

【讨论】:

以上是关于将多线程合并到 C++ 中如何提高性能,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何最大限度地提高实时处理性能(Portaudio)

如何在处理西里尔文文本文件时提高 C++ 性能?

为啥我的解决方案这么慢,如何提高查询的性能?

如何正确使用函数形参提高C++程序性能

提高 Pandas 合并性能

如何通过线程或并行扩展提高 foreach 搜索的性能?