BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

关于.NET中Barrier类的解释

| 作者 Jonathan Allen 关注 595 他的粉丝 ,译者 崇桦 关注 0 他的粉丝 发布于 2011年6月21日. 估计阅读时间: 2 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

随着对多核系统重视的增加,(编程人员)对并行和并发编程的理解显得比从前更加重要。幸运的是,.NET 4在向开发人员提供的同步原语方面做了很多改进。这些同步原语其中之一就是Barrier类(MSDN中对Barrier类的注释:使多个任务能够采用并行方式依据某种算法在多个阶段中协调工作),Emad Omara正是使用了Barrier类实现了并行合并排序。

Emad Omara的并行合并排序算法假设了在排序操作的过程中(操作者)对计算机的所有CPU具有完全的访问权限。虽然这不是必要条件,但只是为了演示。输入数组首先被大致均等地划分为N个分区,这里N是逻辑CPU的数目。每个CPU上都会启动一个线程并针对该CPU所分配到的(输入数组的)分区进行单线程的排序。

这时所有的线程在继续下一阶段的操作之前都必须同步。半数的线程将会退出同时另一半的线程将会在相邻的分区之间进行合并排序。在之前版本的.NET框架中,这些操作将会由低层次的(.NET)原语或者(编程人员)对Thread.Join方法小心谨慎的调用来完成。(而在.NET 4中)Barrier类给我们提供了(实现这些操作的)另一种选择。

新的Barrier类在某些方面就像Thread.Join方法一样,它会等待所有的线程完成(当前阶段)。但它又不像Thread.Join方法那样,所有被等待的线程(在完成当前阶段后)需要退出。(在Barrier类中)取而代之的,它们仅需要发出已经完成当前阶段的信号并时刻准备着开始下一个阶段。这样就省去了(在不同阶段间)结束和重新创建线程,这些改进对于线程池的操作来说尤其重要。

默认情况下Barrier类假设任何一个线程在进行下一阶段的工作前都必须给出前一个阶段的完成信号。很明显这个假设在这里(Emad Omara的并行合并排序算法) 不成立,因为每次在进入了合并排序阶段后(计算机)只需要半数(相对于最初建立的线程数)的线程(来完成后续的操作)。因此Emad在此调用了Barrier.RemoveParticipant方法来把预期将要发出完成信号的线程数量减一。

再次强调这个算法是为了教学目的而设计的,如果要将其运用于产品的构建上那么它还需要进行更多的改进。

查看英文原文Explaining .NET’s Barrier Class

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

hi by cao tou

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT