【渐进】设计一个模拟并行的线程同步组件
来源:互联网 发布:手机接歌软件 编辑:程序博客网 时间:2024/05/01 21:50
您是否遇到下述几个场景: 本文就将针对上述场景的需求设计一个组件来支持您的设计。 从以上的几个场景我们可以分析出其需求: “主线程执行中途,需要等待几个子线程的处理结束后,继续主线程的执行。” 于是,我们将依据此设计一个能满足此特性的组件,也许您已经想到可以简单的利用事件等通知机制来让子线程执行完毕后发出通知然后进行下一步操作: 上图描述了利用事件,消息等机制后形成的执行模型。 再来看一下这张图: 您是否希望让主/子线程编程能在一个方法区域内保持线性的语法书写,而不是通过Callback等方式打乱原本的书写顺序和连贯性? 瞻仰并行 dotnet3.5开始提供了并行计算的支持,PLinq就是Linq的并行版本,在System.Theading空间(是一个单独的并行库System.Theading.dll)下,4.0则极大的增强了并行编程的支持。PLinq给我们提供了如下的启用并行的语法对集合进行遍历: 测试一下: 上述代码的执行效率,根据CPU的核心数,能提高几乎相同的倍数。事实上3.5对并行的支持只算是一个初步的预览。设计使用不当,未必能带来多少的提升。其实现原理同样是利用多线程,并且System.Theading中提供专用的线程池来优化线程的利用。 回到我们的主题上来,上文所确立的需求有点类似并行处理,这是执行行为上类似,不过设计目标还是有所不同的,我们旨在设计线程同步组件,来支持主子线程的同步和语法上的流畅,而并行计算的目的是尽可能的利用CPU的计算能力。 既然是要进行线程同步,就要有相应的同步机制,这里采用了WaitHandle(可参考http://msdn.microsoft.com/zh-cn/library/system.threading.waithandle(VS.80).aspx)来完成这个设计。 关于AutoResetEvent和ManualResetEvent,二者都派生自WaitHandle,类似信号灯的作用,二者区别在于前者会自动唤醒一个线程,后者可编程控制唤醒多个线程。 文章后面将附上代码下载,设计仍有可改进的空间,如线程的利用等。 调用语法: 测试代码: 结果: 如上图所示,主任务暂停后,等待子任务执行完毕就继续执行紧接着的代码段(即主任务)。 代码下载地址:/Files/wsky/ParalleV1.0.rar
出处:http://wsky.cnblogs.com/
以上文字若无注明转载字样则为个人原创,转载请保留签名
Tag标签: 渐进,PLinq,并行,线程同步
- 【渐进】设计一个模拟并行的线程同步组件
- GUI线程的异步并行设计
- 线程的同步、异步、串行、并行的关系
- gcd中同步异步并行串行线程数目的关系
- 同步线程的一个实例
- 线程同步组件
- 【基本组件】线程同步
- 8通道同步并行数据采集PCI模块的设计
- UI组件:父子组件渲染的同步、不同步设计
- 协议设计:如何实现一个最简单的通信协议(线程模拟)
- block并行编程与线程同步
- 线程中同步、异步、串行、并行
- 用vc线程模拟实现并行算法
- 一个数据线程间同步的适配器
- C#中的一个线程同步的例子
- 20、线程同步的一个小问题
- 线程函数的设计以及线程同步要点(MsgWaitForMultipleObjects等)
- 线程函数的设计以及线程同步要点(MsgWaitForMultipleObjects等)
- PHP中设置时区的若干方式
- 郁闷一整天
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Fedora安装rpm包失败
- 卸载WINDOWS服务的命令
- 【渐进】设计一个模拟并行的线程同步组件
- 百度哈工大联合开发框计算关键技术
- 分酒问题——三个酒杯A B C分别可装8升、5升、3升酒,开始B C装满了酒,在没有其它工具的情况下,将酒平分
- Ubuntu 代理上网设置(firefox,新立得,apt-get等)
- .NET技术的详细解读
- Android学习笔记专用博客
- 快毕业了,找工作了!
- Spring集成dbunit
- 李强:利用JAX-WS开发Web服务