C#4.0中的障碍和C#3.0中的WaitHandle之间的区别?
我正在接受C#4.0,其中一个令我困惑的事情就是障碍概念。
这不仅仅是使用WaitHandle
的WaitAll
方法吗? 是不是等待所有线程完成?
我从这个页面学到了屏障结构: 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时,让它们全部消失。” 你不能用另一个构造做什么,但看起来确实很方便。