Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++_Multithreading_Performance - Fatal编程技术网

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

C++ 创建线程对性能总是有好处的吗?,c++,multithreading,performance,C++,Multithreading,Performance,我最近开始尝试在std::thread中使用线程,我想知道使用线程(特别是在c++中)是否有任何缺点。是否存在添加更多线程会降低性能的情况?例如,如果我正在创建多个新线程,每个线程都要运行一个服务器对象来侦听传入的数据,那么为这些服务器实例中的每一个创建一个新线程(性能方面)是否不好?为什么?创建太多线程确实会影响性能 例如,如果每个服务器实例都有一个线程,那么在不切换线程的情况下,不能先为一个服务器实例工作,然后再为另一个服务器实例工作。切换线程会带来成本 另一个问题是当两个或多个线程试图访问

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

创建太多线程确实会影响性能

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

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

你一定要避免那些不创建更多线程就无法完成“更多工作”的设计。如果您有三个服务器,每个服务器都有一个线程,那就好了。如果您有数百个客户机,并且有一个由十个线程组成的池为它们服务,那么这很好。如果您有一些特殊的事情要做(比如监视时钟变化),最好由它们自己的线程来完成,那也没关系

但一般来说,有大量工作要做的服务器应该将这些工作分配给固定的线程集合。该集合中的线程数应基于系统拥有的内核数、可有效挂起的I/O数以及预期的意外延迟量(如硬页错误)

  • 创建线程可能会很昂贵。如果要做的工作非常少,可能不值得。显示创建线程可能需要~毫秒

  • 线程是对CPU核心的抽象,虽然您基本上可以创建任意数量的线程,但可用核心的数量是固定的。在某一点之后,你将不会得到额外的加速,因为硬件已经没有更多的功能了,实际上你可能会引入更多的簿记和通信开销

  • 即使您不受硬件并发性的限制,大多数工作负载也不是完全可并行的,并且您将受到问题的非并行部分的限制。见:


  • “创建线程总是对性能有好处吗?”-不!一个很好的例子:绝对不是!从我的错误中吸取教训。在我参与的一个项目中,我们为每个IP连接创建了一个线程。一个开发人员将其转换为使用
    select
    语句,一个线程将处理多个连接。我们发现临界点是一个线程处理50个连接,这是当一个线程比一个线程管理51个连接更好时。因此,1:1的比例是非常低效的。经验教训:配置文件,配置文件,配置文件,测量,测量。@Eljay shume select不再使用。极大地提高了性能。是否有使用阿姆达尔定律的预期加速比和实际加速比的图表?下面是我在快速搜索中发现的一个示例:尽管我确信这在很大程度上取决于工作负载的结构和运行环境。谢谢,这非常有帮助。我可以说,哇!您在我发布问题后2分钟内发布了此答案。这是我第一次问问题,我不知道回答会这么快。