可重复使用的并行数据结构和算法.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

-

9种可重复使用的并行数据构造和算法

目录

倒计数锁存(CountdownLatch)可重用旋转等待(SpinWait)屏障(Barrier)阻塞队列受限缓冲区(BoundedBuffer)Thin事件无锁定LIFO

堆栈循环分块并行分拆总结

本专栏并未涉及很多公共语言运行库(CLR)功能的机制问题,而是更多介绍了如何有

效使用您手头所具有的工具。身为一名程序员,必须做出很多决策,而选择正确的数据构造

和算法无疑是最常见的,也是最重要的决策之一。错误的选择可能导致程序无法运行,而大

多数情况下,则决定了性能的好坏。鉴于并行编程通常旨在改良性能,并且要难于串行编程,

因此所作的选择对您程序的成功就更为重要。

在本专栏中,我们将介绍九种可重复使用的数据构造和算法,这些构造和算法是许多并

行程序所常用的,您应该能够轻松将它们应用到自己的.NET软件中。专栏中每个例如随附

的代码都是可用的,但尚未经过完全定型、测试和优化。这里列举的模式虽然并不详尽,但

却代表了一些较为常见的模式。如您所见,很多例如都是互为补充的。

在开场前,我想还是先介绍一些相关内容。Microsoft®.NETFramework提供了几个

现有的并发基元。虽然我要为您讲解如何构建自己的基元,但实际上现有基元是足以应付大

多数情况的。我只是想说*些可选的方案有时也是有参考价值的。此外,了解这些技巧如何

应用于实际操作也有助于加深您对并行编程的整体理解。在开场讲解前,我假定您对现有基

元已经有了一个根本的了解。您也可以参阅MSDN®杂志2005年8月版的文章“关于多

线程应用程序:每个开发人员都应了解的内容〞,以全面了解其概念。

一、倒计数锁存(CountdownLatch)

Semaphore之所以成为并发编程中一种较为知名的数据构造,原因是多方面的,而并

不只是因为它在计算机科学领域有着悠久的历史〔可以追溯到19世纪60年代的操作系

统设计〕。Semaphore只是一种带有一个计数字段的数据构造,它只支持两种操作:放置

和取走〔通常分别称为P和V〕。一次放置操作会增加一个semaphore计数,而一次取

走操作会减少一个semaphore计数。当semaphore计数为零时,除非执行一项并发的放

置操作使计数变为非零值,否则任何后续的取走尝试都将阻塞〔等待〕。这两种操作均为不

可再分(atomic)操作,并发时不会产生错误,能够确保并发的放置和取走操作有序地进展。

Windows具有根底内核和对semaphore对象的Win32支持〔请参阅CreateSemaphore

和相关API〕,并且在.NETFramework中这些对象可以通过System.Threading.Semaphore

类公开到上层。Mute*和Monitor所支持的临界区,通常被认为是一种特殊的

semaphore,其计数会在0和1之间来回切换,换句话说,是一个二进制的semaphore。

.z.

-

另外还有一种“反向semaphore〞也是非常有用。也就是说,有时您需要数据构造能够

等待数据构造计数归零。Fork/join式并行模式在数据并行编程中是极为常见的,其中由单

个“主〞线程控制执行假设干“辅助〞线程并等待线程执行完毕。在这类情况下,使用反向

semaphore会很有帮助。大多数时候,您其实并不想唤醒线程来修改计数。因此在这种情

况下,我们将构造称为倒计数“锁存〞,用来表示计数的减少,同时还说明一旦设置为“Signaled

〞状态,锁存将保持“signaled〞〔这是一个与锁存相关的属性〕。遗憾的是,Windows

和.NETFramework均不支持这种数据构造。但令人欣慰的是,构建这种数据闭锁并不难。

要构建倒计数锁存,只需将其计数器初始值设为n,并

文档评论(0)

195****6963 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档