快速业务通道

浅谈.NET下的多线程和并行计算(五)线程池基础 上

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

我们看到,10个线程使用了3.5秒全部执行完毕。20个线程呢?

需要6秒。细细分析这2个图我们不难发现,新的线程不是在不够用的时候立即创建而是延迟了0.5秒左 右的时间,这是因为线程池会等待一下看是不是有线程在这段时间内可用,如果实在没有的话再创建。其 实可以这么理解这6秒,前一秒只有2个线程,后4秒有4个线程执行了16个,最后1秒又只有2个线程了,所 以一共是2+4*4+2=20,6秒处理了20个线程。

ThreadPool还有一个很有用的方法可以注册一个信号量,我们发出信号后所有关联的线程才执行,否 则就一直等待,还可以指定等待的时间:

首先定义信号量和存储结果的字段:

static ManualResetEvent mre = new ManualResetEvent(false);
static int result = 0;

程序如下:

Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < totalThreads; i++)
{
   ThreadPool.RegisterWaitForSingleObject(mre, (state, istimeout) =>
     {
       Thread.Sleep(1000);
       int a, b;
       ThreadPool.GetAvailableThreads(out a, out b);
       Interlocked.Increment(ref result);
       Console.WriteLine(string.Format("({0}/{1}) #{2} : {3}", a, b,  Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("mm:ss")));
       lock (locker)
       {
         runningThreads--;
         Monitor.Pulse(locker);
       }
     }, null, 500, true);
}

Thread.Sleep(1000);
result = 10;
mre.Set();
lock (locker)
{
   while (runningThreads > 0)
     Monitor.Wait(locker);
}
Console.WriteLine(sw.ElapsedMilliseconds);
Console.WriteLine(result);
Console.ReadLine();

程序结果如下:

注意到RegisterWaitForSingleObject的第一个参数就是信号量,第二个参数就是方法主体(接受两个 参数分别是传给线程的一个状态变量以及线程执行的时候是否超时),第三个参数是状态变量,第四个参 数超时时间我们设置了500毫秒,由于主线程在1秒后发出信号,超时500毫秒,所以这些线程并没等到信 号的发出500毫秒之后就运行了。之所以程序的运行结果为30是因为即使500毫秒之后线程超时开始执行但 是也要等1秒才累加结果,在这个时候主线程早已把结果更新为10了,所以累加从10开始而不是0开始。最 后布尔参数为true表明接受到信号后只线程执行一次。

观察到,所有线程执行完毕花了7秒的时间,除去开始的等待时间0.5秒,相比之前的例子还多了0.5秒 的时间。这是为什么呢?请大家帮忙分析分析。还有一个更奇怪的问题是, RegisterWaitForSingleObject消耗的是IO线程而不是工作线程,难道微软觉得 RegisterWaitForSingleObject常见于IO操作的应用还是不希望不浪费工作线程?

本文配套源码

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号