【问题标题】:Need help understanding .net ThreadPool需要帮助理解.net ThreadPool
【发布时间】:2011-02-22 07:39:02
【问题描述】:

我想了解 ThreadPool 的作用,我有这个 .NET 示例:

class Program
{
    static void Main()
    {
        int c = 2;

        // Use AutoResetEvent for thread management

        AutoResetEvent[] arr = new AutoResetEvent[50];

        for (int i = 0; i < arr.Length; ++i)
        {
            arr[i] = new AutoResetEvent(false);
        }

        // Set the number of minimum threads
        ThreadPool.SetMinThreads(c, 4);

        // Enqueue 50 work items that run the code in this delegate function
        for (int i = 0; i < arr.Length; i++)
        {
            ThreadPool.QueueUserWorkItem(delegate(object o)
            {
                Thread.Sleep(100);
                arr[(int)o].Set(); // Signals completion

            }, i);
        }

        // Wait for all tasks to complete
        WaitHandle.WaitAll(arr);
    }
}

这是否会运行 50 个“任务”,每组 2 个 (int c),直到它们全部完成?或者我不明白它的真正作用。

【问题讨论】:

  • 嗯,你试过运行它并观察会发生什么吗?
  • 这不是很好地解释了 SetMinThreads 应该做什么。 msdn.microsoft.com/en-us/library/… ...最终,实际启动的线程数将取决于可用的系统资源,每次运行时可能会发生变化。

标签: c# multithreading visual-studio-2010 threadpool


【解决方案1】:

如果你有时间,我真的会推荐这个阅读:

http://www.albahari.com/threading/

这是一本出色的读物,奠定了从基本线程到并行编程的基础和工作方式。我建议您在尝试修改线程池代码之前对前两章有基本的了解! :)

【讨论】:

  • 这是一个很好的链接,也是关于线程正在发生的事情的绝佳资源。我完全忘了提到这一点。好的! +1
  • 过去 3 天我一直在阅读和重新阅读它,同时尝试实施它!
  • 我们创建了一个多线程服务来处理非常具体的请求,他的 Wait-and-Pulse 模式解释非常宝贵。 albahari.com/threading/part4.aspx#_How_to_Use_Wait_and_Pulse
  • 对我们而言,我们的投票服务受到定期投票之间发生的大量后台工作的影响。我什至还没到第 4 章,只是在后台工作程序(.net 3.5)和锁中使用 EAP 模式。在这个阶段我还没有足够的信心做更多的事情!但是,是的,简洁明了的解释。经过多次尝试,我才真正开始理解线程。
【解决方案2】:

通过设置最小线程数,您要求.NET 运行时做的唯一事情就是请为线程池分配至少2 个线程。您不是要求它自身限制为 2。

因此,无法保证您的程序将为此使用多少线程。这取决于您的系统和许多其他因素。

我做了一个简单的测试(对您的程序进行了微小的更改,以跟踪同时进入睡眠调用的线程)一次运行达到 4 个,另一个运行 3 个,另一个运行 7 个,另一个运行 10 个,等等。

p>

您确实不需要更改线程池大小。

你想完成什么?

【讨论】:

    【解决方案3】:

    来自SetMinThreads 上的 MSDN 文档:

    需求低时,实际数量 的线程池线程可以低于 最小值。

    因此,您指定的值并不能保证 2 个工作线程将处理排队的项目。它可能是 1 个工作线程(因为您将它们排在一个循环中,它可能会在下一个排队之前完成),或者它可以根据系统资源和必须完成的工作量使用更多.

    如果您真的想看看发生了什么,请查看Process Monitor 之类的工具。您可以监控进程的线程创建并跟踪它们何时被创建、销毁等。这将真正帮助您了解您的应用程序(和底层框架)正在做什么。

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      背景:.NET 线程池管理线程的常规方法可能很麻烦。它可以很好地限制由资源争用引起的问题,但这样做是以牺牲线程创建速度为代价的。为了通过线程池提高工作线程的性能,设计者允许使用一种机制,该机制允许在不经过队列进程的情况下创建一定数量的线程。

      SetMinThreads() 指定应简单地“按需”创建的线程数,即直接启动而不检查当前线程数或排队以缓慢加速。

      框架会立即创建前两个线程,就像您手动设置它们并使用 Thread.Start 启动它们一样。除此之外,直到当前的 MaxThreads 计数,框架将开始对工作线程的请求进行排队,并以指定的时间间隔(默认为 250ms,我相信这也可以配置)启动它们,以避免资源冲突。这样做的原因是,如果您想象一个循环行为,即启动一个访问资源的线程,进行一些计算,然后将结果写入其他地方,您可以看到 5 个线程几乎同时启动会导致试图获取的 logjam到第一个资源。在 MaxThreads 阈值时,队列停止;在完成之前不会创建新线程。

      因此,根据您的代码的性质,将安排 50 个单独的工作任务,但并非所有 50 个将同时运行;运行时将允许两个立即启动,然后等待 250 毫秒或直到一个结束,然后再开始下一个。因为线程将在不到 250 毫秒的时间内执行和终止,所以您不可能同时看到超过 2 个工作线程;创建第三个线程之前的等待永远不会发生,因为“不受限制”的工作线程将首先释放,并且正在等待的工作线程在其等待时间到期之前被启动,然后时钟被下一个重置。

      【讨论】:

        猜你喜欢
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 2022-01-15
        • 1970-01-01
        • 2012-09-01
        相关资源
        最近更新 更多