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

时间:2011-03-09 01:07:58

标签: c# .net multithreading

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

2 个答案:

答案 0 :(得分:8)

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

另一方面,如果线程没有资格运行(例如在一些同步对象上被阻塞),那么你可以拥有的数量的限制将由CPU以外的因素决定(堆栈的内存,操作系统)内部限制等)。

答案 1 :(得分:7)

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

如果您的应用程序受CPU限制(99%的时间用于内存,很少有I / O或等待其他内容,如用户输入或其他线程),那么最佳的是每个逻辑核心1个线程,因为在这种情况下不会有上下文切换。

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