c# - 如果启动太多线程会怎样?

标签 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();
}

我正在运行一组异步任务,但在每个异步方法中,我都封装了需要在新线程中完成的所有工作。如果我多次调用 B 会怎样?处理器将如何处理过多的线程?

最佳答案

CPU 只执行操作系统告诉它的,操作系统是 in charge哪些线程运行以及它们在被中断之前运行了多长时间。调度程序中内置了一些反饥饿机制,因此它永远不会完全锁定系统,但如果你只是继续生成尽可能多的线程,直到内存或地址空间用完,你几乎可以让它屈服。

如果我们假设您的程序是唯一运行的程序,那么理想的线程数与 CPU 内核数相同(如果任务受 CPU 限制)。如果任务受 I/O 限制或需要等待内核对象,那么更多线程可能是理想的。

如果您创建了数千个线程,那么您将浪费时间在它们之间进行上下文切换,并且您的工作将需要更长的时间才能完成。您应该使用 thread pool 而不是手动启动新线程执行您的工作,以便 Windows 本身可以平衡最佳线程数。

await 和其他高级异步关键字可能已经使用了线程池。

关于c# - 如果启动太多线程会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44169993/

相关文章:

c++ - 在同一硬件单元上创建多个线程

c# - OleDbConnection.Open() 仅在一个项目中引发异常,相同的代码适用于其他项目

c++ - 当我的 C++ 控制台程序被未知进程关闭时如何删除?

windows - 在cmd中建立VPN连接

windows - 需要确定以太网适配器的网络访问类型

java - java中的synchronized关键字

c++ - 尽管有线程,Qt GUI 仍挂起

c# - C#中事件的正常实现和显式实现之间有什么区别

c# 自定义表达式变量(因为我没有更好的术语)

c# - 在 WPF 中加载多个图像时防止内存膨胀