C#4.0中的障碍和C#3.0中的WaitHandle之间的区别?

我正在接受C#4.0,其中一个令我困惑的事情就是障碍概念。

这不仅仅是使用WaitHandleWaitAll方法吗? 是不是等待所有线程完成?

我从这个页面学到了屏障结构: http : //www.managed-world.com/archive/2009/02/09/an-intro-to-barrier.aspx

但是,它看起来就像WaitAll方法。 我错过了什么? 这有什么区别?

谢谢。

听起来你好奇为什么障碍比WaitHandle + WaitForAll衍生物更受欢迎? 如果结构合理,两者都可以达到类似的目标。

我对Barrier并不是非常熟悉但是跳出来的一个优势是资源问题。 要将N个线程与Barrier同步,只需要一个Barrier实例。 要通过WaitHandle同步N个线程,WaitAll需要N个句柄。 这些资源很便宜,但不是免费的。 减少同步一组线程的资源数量具有优势。

见障碍 。 它等待一组多个线程达到某个点,而不是一个。 它通常用于科学计算和模拟,以表示时间“滴答声”。

想象一下代表立方英里空气的1000 x 1000 x 1000立方体网格。 在零时刻,给定的单位立方体受到其邻居的各种参数(如温度和压力)的影响。 一旦每个人计算出时间1,你就会在时间2做同样的事情……你会得到一个天气模拟。 类似的核模拟故事。

还有一种称为CyclicBarrier的屏障变体,它接受未从起始线起飞的线程,并在一段时间后将其连接回组中。 从文档中不清楚C#4的屏障是否是一个循环屏障,但有一个名为ParticipantsRemaining的属性。

Barrier提供了更高级别的抽象和便利:单个SignalAndWait调用是每个线程需要做的事情,而不是必须知道它应该发出信号的数组中的哪个句柄(或使用互斥量来查找和增加“下一个可用的点”数组“和信号”,并且必须首先发信号然后WaitAll

最后,您可以通过适当使用其他同步机制来执行相同的同步任务,但是对于像Barrier一样的常见使用模式,可以方便地使用这样一种方便且简单的解决方案,并且整齐地打包; – )。

WaitFor是一个Transact SQL语句。 它会阻止批处理,存储过程或事务的执行,直到达到指定的时间或时间间隔,或者指定的语句修改或返回至少一行。

Barrier是一个同步原语,它强制在给定点的多个线程或进程之间停止执行,并阻止进一步执行,直到所有线程或处理器都到达给定点。

如果您指的是WaitAll,WaitAll要求您维护WaitHandles数组。 从这个意义上讲,屏障使用起来有点简单。 但是,我同意这两种方法看起来非常相似。

主要的弱点函数WaitAll是一个最大句柄限制(只能使用64个句柄) WaitHandle.WaitAll 64句柄限制的解决方法?

对我来说似乎是一个等待的等待句柄。 为您提供方便的说法“当等待此锁的线程数变为X时,让它们全部消失。” 你不能用另一个构造做什么,但看起来确实很方便。