每个CPU的线程实际限制是多少?

Bob*_*der 7 .net c# multithreading

我一直在玩线程,试图将极限推到极致 - 为了我自己的娱乐.我知道线程池默认为25个线程,可以推送到1000(根据MSDN).但是,每个CPU核心的线程的实际限制是什么?在某些时候,上下文切换将导致比线程保存更多的瓶颈.有没有人有这方面的最佳做法?我们在说100,200,500吗?它取决于线程在做什么?除了框架规定的架构之外,什么决定每个CPU核心有多少线程以最佳方式运行?

Jon*_*Jon 8

当然,这完全取决于线程正在做什么.如果它们受CPU限制(比如坐在无限循环中),那么每个核心一个线程就足以使CPU饱和; 除此之外(你已经有更多,来自后台进程等),你将开始争用.

另一方面,如果线程不符合运行条件(例如在一些同步对象上被阻塞),那么你可以拥有的数量的限制将由CPU以外的因素决定(堆栈的内存,OS内部限制,等等).


fer*_*olo 7

如果您的应用程序不受CPU限制(如大多数),那么上下文切换并不是什么大问题,因为每次您的应用程序必须等待时,都需要进行上下文切换.线程太多的问题是关于操作系统数据结构和一些同步异常,比如饥饿,由于同步算法的随机性,线程永远(或很少)有机会执行.

如果你的应用程序是CPU绑定的(保留99%的时间在内存上,很少I/O或等待其他东西,如用户输入或其他线程),那么最佳的是每个逻辑核心1个线程,因为在此情况下不会有上下文切换.

请注意操作系统每次都会中断线程,即使只有一个线程用于多个CPU.操作系统中断线程不仅可以进行任务切换,还可以用于线程管理(例如更新计数器以显示在任务管理器上,或允许超级用户杀死它).

  • @Joel Gauvreau称之为好奇心.这不是我们最初在这份工作中结束的原因.对知识和理解的渴望......所以我的答案是"要知道什么?" 是"只知道". (2认同)
  • 虽然操作系统有许多线程,但它们都不受CPU限制(否则操作系统会杀死为应用程序设计的瓦特).对于CPU绑定应用程序(这是一个非常罕见的情况),每个核心一个线程是最佳的周期.如果应用程序"几乎"CPU绑定(如90ms CPU和10ms等待每100ms),那么添加更多线程是有用的.因为大多数应用程序等待90毫秒和10毫秒(或更少)CPU,所以许多线程都可以使用.但是,仍然没有适用于所有情况的神奇数字. (2认同)