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

Gur*_*epS 10 .net c# multithreading .net-4.0

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

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

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

但是,它似乎就像WaitAll方法一样.我错过了什么?这有什么区别?

谢谢.

Jar*_*Par 11

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

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


Eug*_*ota 6

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

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

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


Ale*_*lli 6

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

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