创建线程总是对性能有好处吗?

Red*_*hts 2 c++ performance multithreading

我最近开始尝试将线程与 一起使用std::thread,我想知道使用线程是否有任何缺点(特别是在 C++ 中)。是否存在添加更多线程会降低性能的情况?例如,如果我要创建多个新线程,每个线程都运行一个侦听传入数据的服务器对象,那么为这些服务器实例中的每一个创建一个新线程是否不好(性能方面)?为什么/为什么不?

Dav*_*rtz 5

创建太多线程确实会损害性能。

例如,如果每个服务器实例都有一个线程,那么您不能在不切换线程的情况下为一个服务器实例工作然后为另一个服务器实例工作。切换线程会产生相关成本。

另一个问题是当两个或多个线程尝试访问相同的信息集合时。这可能会导致争用,从而降低整个系统的速度。现代 CPU 具有多个内核,但内核间资源有限。争夺相同对象的线程会使这些内核间总线饱和。

您肯定希望避免在不创建更多线程的情况下无法完成“更多工作”的设计。如果您有三台服务器并且每台服务器都有一个线程,那很好。如果您有数百个客户端并且有一个由 10 个线程组成的池为它们提供服务,那很好。如果你有一些特别的事情要做(比如监视时钟变化),最好由他们自己的线程完成,那也很好。

但通常,有大量工作要做的服务器应该将这些工作分配给固定的线程集合。该集合中的线程数应基于系统拥有的内核数、可同时挂起的 I/O 数以及预期的意外延迟(例如硬页面错误)数量等因素.