【问题标题】:Sleeping in a pooled C# thread在池化 C# 线程中休眠
【发布时间】:2011-09-12 10:40:59
【问题描述】:

this C# 线程网络教程中,Joseph Albahari 写道:“不要在池线程中睡觉!”为什么不应该这样做?它对性能的影响有多严重? (不是我想做,只是好奇。)

【问题讨论】:

    标签: c# multithreading threadpool sleep


    【解决方案1】:

    线程是一个重量级的对象。
    创建一个新线程需要大量资源,例如为托管堆栈分配 1 MB、创建托管线程对象、内核堆栈、内核线程对象、用户线程环境块。这一切都需要时间和记忆。因此,您不想真正快速地创建和销毁对象。此外,一旦你有多个线程,上下文切换也会占用一些资源

    线程池是 CLR 可以放置未使用的线程的地方,以防您的应用程序需要它。
    线程池最初包含 0 个线程,一旦您从池中请求线程,池将快速创建为池定义的最小线程数。大约 2 分钟后,未使用的线程被杀死。但是如果负载增加并且您需要更多线程,线程池将慢慢创建新线程,直到达到最大界限。您的线程数不能超过最大值,一旦工作线程返回池,所有新请求都将排队并执行。在更糟糕的情况下,您可以获得 OutOfMemoryException

    如果从池中取出的线程被阻塞,它:

    • 持有资源
    • 不做任何有价值的工作,而应用程序可能需要此线程来处理新请求
    • 通过引入块来打破可扩展性

    【讨论】:

      【解决方案2】:

      线程池旨在快速在不同线程上执行相对较短的任务,而无需花费创建新线程的成本。线程池有一个最大线程数,一旦达到,任务就会排队,直到有线程可用。

      因此,在线程池中休眠的线程会阻塞队列,或导致线程池耗尽。

      【讨论】:

      • 您的第一行似乎与您所说的其余部分相矛盾。确实阻止队列或线程耗尽会直接降低性能吗?
      • 我的意思是在池线程中休眠不会降低该线程的性能。措辞有点差,我同意。我已将其删除。
      • 啊,是的,我明白你的意思了。它不会降低一个线程的性能,但会降低使用池的整个进程的性能。这确实有道理。 :)
      【解决方案3】:

      线程池中只有有限数量的线程;线程池旨在高效执行大量任务。它们依赖于每个任务快速完成,以便线程可以返回到池中并用于下一个任务。

      因此,在线程池中休眠的线程会耗尽池,最终可能会耗尽可用线程,并且无法处理您分配给它的任务。

      【讨论】:

        猜你喜欢
        • 2019-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多