当你创建太多线程时会发生什么?它会导致 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();
}
我正在运行一组异步任务,但在每个异步方法中,我都封装了需要在新线程中完成的所有工作。如果我多次调用 B 会怎样?处理器将如何处理过多的线程?
最佳答案
CPU 只执行操作系统告诉它的,操作系统是 in charge哪些线程运行以及它们在被中断之前运行了多长时间。调度程序中内置了一些反饥饿机制,因此它永远不会完全锁定系统,但如果你只是继续生成尽可能多的线程,直到内存或地址空间用完,你几乎可以让它屈服。
如果我们假设您的程序是唯一运行的程序,那么理想的线程数与 CPU 内核数相同(如果任务受 CPU 限制)。如果任务受 I/O 限制或需要等待内核对象,那么更多线程可能是理想的。
如果您创建了数千个线程,那么您将浪费时间在它们之间进行上下文切换,并且您的工作将需要更长的时间才能完成。您应该使用 thread pool 而不是手动启动新线程执行您的工作,以便 Windows 本身可以平衡最佳线程数。
await
和其他高级异步关键字可能已经使用了线程池。
关于c# - 如果启动太多线程会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44169993/