最大线程数CPU

3

这与处理器的线程有什么关系呢?例如,Intel i5有四个内核和四个线程。

我们的程序可以使用多少个线程?例如在C++中使用std::thread (STL)?

对于一个程序来说,8个线程是一个大的还是一个低的数量呢?


2
操作系统的工作是让处理器看起来可以执行无限数量的线程,就像它假装您的程序不必与运行在机器上的其他程序共享处理器一样。如果您想使代码更有效率,那么您应该考虑将创建的线程数限制为核心数,这样操作系统就不必额外进行上下文切换的工作了。 - Hans Passant
1个回答

3
这要看情况而定。通常来说,把线程的数量限制在接近核心数的范围内(否则你可能会有太多的上下文切换)。你可以使用std::thread::hardware_concurrency()作为一个提示。通常情况下,你需要用一个线程池来组织你的程序。
然而,真正重要的是活跃线程的数量。有些程序有数百个线程,但是它们被组织成只有其中很少一部分在任何给定时刻处于活动状态(即可运行状态),大部分线程都处于空闲状态(等待IO、互斥锁或条件变量)。
请注意,线程是一个相当重的资源(特别是因为它有自己的调用栈,通常至少有一个兆字节)。因此不要过多地使用线程(因此,除非你拥有一个功能强大且昂贵的计算机,否则拥有数千个线程通常是不合理的)。
英译中:

英特尔超线程技术常常让人失望。在一个拥有4个核心和8个超线程的英特尔处理器上,你可能不想同时激活8个线程。你需要进行基准测试,但是在这种情况下应该预计会出现一些性能问题(也许只有4或6个活跃线程会使整体性能更好)。

线程是由操作系统提供和管理的一种抽象}。因此,阅读{{link5:操作系统:三个易于理解的部分,以了解更多关于操作系统的信息。


1
非常棒的回复。谢谢! - Impurity
1
关于“真正重要的是活跃线程的数量……”这一点,您可以不必试图定义“活跃”和“非活跃”,而是可以谈论存在于多个CPU之间进行并行使用的线程(也称为“工作线程”或“计算绑定线程”)与主要存在于等待和处理来自不同、未同步源的事件的线程。 - Solomon Slow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接