网站大量收购独家精品文档,联系QQ:2885784924

9 种可重复使用的并行数据结构和算法--.doc

9 种可重复使用的并行数据结构和算法--.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9 种可重复使用的并行数据结构和算法--.doc

  9 种可重复使用的并行数据结构和算法   本文示例源代码或素材下载 目录   倒计数锁存 (Countdoeaphore 之所以成为并发编程中一种较为知名的数据结构,原因是多方面的,而并不只是因为它在计算机科学领域有着悠久的历史(可以追溯到 19 世纪 60 年代的操作系统设计)。Semaphore 只是一种带有一个计数字段的数据结构,它只支持两种操作:放置和取走(通常分别称为 P 和 V)。一次放置操作会增加一个 semaphore 计数,而一次取走操作会减少一个 semaphore 计数。当 semaphore 计数为零时,除非执行一项并发的放置操作使计数变为非零值,否则任何后续的取走尝试都将阻塞(等待)。这两种操作均为不可再分 (atomic) 操作,并发时不会产生错误,能够确保并发的放置和取走操作有序地进行。utex 和 Monitor 所支持的临界区,通常被认为是一种特殊的 semaphore,其计数会在 0 和 1 之间来回切换,换句话说,是一个二进制的 semaphore。   另外还有一种反向 semaphore也是非常有用。也就是说,有时您需要数据结构能够等待数据结构计数归零。Fork/join 式并行模式在数据并行编程中是极为常见的,其中由单个主线程控制执行若干辅助线程并等待线程执行完毕。在这类情况下,使用反向 semaphore 会很有帮助。大多数时候,您其实并不想唤醒线程来修改计数。因此在这种情况下,我们将结构称为倒计数锁存,用来表示计数的减少,同时还表明一旦设置为Signaled状态,锁存将保持signaled(这是一个与锁存相关的属性)。遗憾的是,odFrequency gt; 0)       Thread.SpinodFrequency * 0.05f)));     else       Thread.Sleep(m_count lt;= s_yieldOneFrequency ? 0 : 1);     return oldCount;   }   private void Yield() {     Thread.Sleep(m_count lt; s_yieldOneFrequency ? 0 : 1);   } } private const int s_spinCount = 4000; public void icrosoft Media Center 和 yPartition(partitions[myIndex]);   barrier.AyIndex - 1]);   barrier.A; using System.Threading; public class Barrier {   private volatile int m_count;   private int m_originalCount;   private Eventonitor 或 Readeronitor.Pulse(m_queue);       Monitor.onitor.onitor.Pulse(m_queue);     }     return c.m_obj;   } }  请注意,我们可以在 Enqueue 方法中依次调用 Pulse 和 B 内存。一小时后,这个数字将飙升至 1GB 以上。解决这一问题的一个方法是调整生产者线程与使用者线程的比例,在上述情况中,要将比例调整为一个生产者对应五个使用者。但是到达速度通常是不稳定的,这会导致系统周期性的不稳定,并带来一些明显的问题,简单的固定比例是无法解决这个问题的。   服务器上的程序通常是长时间运行的,人们希望程序能够长期保持良好的运行状态,但如果内存使用不受限,就会造成不可避免的混乱,还可能导致必须定期回收服务器进程的情况。   受限缓冲区允许您对生产者强制阻塞前缓冲区可能达到的大小进行限制。阻塞生产者可让使用者有机会赶上(通过允许其线程接收调度时间片),同时还能够解决内存使用量增加的问题。我们的方法还是仅封装 Queuelt;Tgt;,同时添加两个等待条件和两个事件通知条件:生产者在队列满时等待,直至队列变为非满,而使用者在队列空时等待,直至变为非空;生产者在生产出项目后通知等待的使用者,而使用者也会在取走项目后通知生产者,如图 6 中所示。 Figure6 受限缓冲区 (Bounded Buffer) public class BoundedBufferlt;Tgt; {   private Queuelt;Tgt; m_queue = ne_consumersonitor.onitor.PulseAll(m_queue);     }   }   public T Dequeue() {     T e;    

文档评论(0)

ggkkppp + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档