Sky*_*edy 3 c# windows multithreading processor
创建太多线程会发生什么?它会导致 CPU 崩溃还是在 Windows 操作系统上有某种内部负载平衡机制?
我正在运行以下代码:
private async void A(string[] a)
{
var tasks = a.Select(B);
await Task.WhenAll(tasks);
}
private async Task B(string b)
{
new Thread(async delegate ()
{
//all the work that needs to be done
}).Start();
}
Run Code Online (Sandbox Code Playgroud)
我正在运行一系列异步任务,但在每个异步方法中,我都将所有需要在新线程中完成的工作封装起来。如果我多次呼叫 B 会发生什么?处理器将如何处理过多的线程?
CPU 只执行操作系统告诉它的内容,操作系统负责运行哪些线程以及它们在被中断之前运行多长时间。调度程序中内置了一些反饥饿功能,因此它永远不会完全锁定系统,但是如果您只是继续生成尽可能多的线程,直到内存或地址空间用完,您可能几乎可以将其瘫痪。
如果我们假设您的程序是唯一运行的程序,那么理想的线程数与 CPU 内核数相同(如果任务受 CPU 限制)。如果任务受 I/O 限制或需要等待内核对象,那么更多线程可能是理想的。
如果您创建了数千个线程,那么您将浪费时间在它们之间进行上下文切换,并且您的工作将需要更长的时间才能完成。您应该使用线程池来执行您的工作,而不是手动启动新线程,以便 Windows 本身可以平衡最佳线程数。
await 和其他高级异步关键字可能已经使用线程池。