【问题标题】:Difference between Barrier in C# 4.0 and WaitHandle in C# 3.0?C# 4.0 中的 Barrier 和 C# 3.0 中的 WaitHandle 之间的区别?
【发布时间】:2009-06-13 16:25:29
【问题描述】:

我正在学习 C# 4.0,其中一件让我感到困惑的事情是屏障概念。

这不就像使用WaitHandleWaitAll方法一样吗?那不是等待所有线程完成吗?

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

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

谢谢。

【问题讨论】:

  • 我不熟悉 Barrier 类,但是通过该链接阅读,我也看不出任何差异。它们要么非常微妙,要么我喜欢你在这里遗漏了一些明显的东西。

标签: c# .net multithreading .net-4.0


【解决方案1】:

听起来您很好奇为什么 Barrier 比 WaitHandle + WaitForAll 衍生品更受欢迎?如果结构合理,两者都可以实现类似的目标。

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

【讨论】:

  • 我想你已经搞定了(重新 N 处理点,这是一个很好的处理点)。
  • 你确定 WaitHandle 方法需要 N 个 WaitHandles 吗?我认为以下代码可以完美运行,并且仍然只需要一个对象。 (由于空间不足,请参阅此页面上的代码,因为在另一个答案中)
【解决方案2】:

Barrier。它等待一组多个线程到达某个点,而不是一个。在科学计算和模拟中经常使用它来表示时间“滴答”。

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

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

【讨论】:

【解决方案3】:

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

当然你可以通过适当使用其他同步机制来执行相同的同步任务,但是对于Barrier体现的这种常见的使用模式,已经有了这样一个方便且万无一失的解决方案是很方便的并整齐地包装起来;-)。

【讨论】:

    【解决方案4】:

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

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

    如果您指的是 WaitAll,WaitAll 要求您维护一个 WaitHandles 数组。从这个意义上说,屏障使用起来更简单一些。不过,我同意这两种方法看起来确实非常相似。

    【讨论】:

    • 我认为他的意思是 WaitAll 方法:msdn.microsoft.com/en-us/library/…。 (还有 WaitOne 和 WaitAny 方法。)
    • 对不起,我的意思是 WaitAll() 方法。刚刚把我的条款搞混了:)
    【解决方案5】:

    对我来说似乎是一个计数的等待句柄。让你方便地说“当等待这个锁的线程数变成 X 时,让它们全部离开”。这不是你不能用另一个构造做的,但它看起来确实很方便。

    【讨论】:

    • 如果是这样的话,是的,信号量也可以完成同样的工作。
    • 好吧,一个计数的信号量让我们通过一定的数量而不考虑到达时间,然后保留其余的。所以,它有点像反向信号量。它不是让 X 在任何给定时间通过,而是让 X 等待,然后让他们一次通过。
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多