AutoResetEvent专门支持的并行模式

时间:2012-07-06 19:26:01

标签: c# .net concurrency

msdn AutoResetEvent

问题

哪种并行模式最适合AutoResetEvent?

背景

在比较线程之间的同步选项时,我们可能会将AutoResetEventManualResetEvent进行比较。考虑这两个区别:

  1. AutoResetEvent最多释放一个等待线程。
  2. AutoResetEvent在释放一个等待线程后自动重置
  3. 重要的是要注意,如果两个线程正在等待并且AutoResetEvent触发两次,则可能发生竞争条件并且仅释放一个线程。可以使用更多的锁来防止这种情况 - 但问题的焦点是关于AutoResetEvent哪种模式做得最好(也许这意味着它自己支持哪种模式)。

1 个答案:

答案 0 :(得分:0)

我不确定在这种情况下我们可以讨论并行模式。模式比仅仅AutoResetEvent等同步机制具有更高的抽象级别。

当我们谈到并行模式时,我们指的是解决常见并行问题的通用方法,如数据结构的几何分解,并行分治,生产者 - 消费者等等,可以用整个范围具体实现低层机制,语言和平台无关。

AutoResetEvent是一种.NET同步机制。它可以与Thread类一起使用,以在具体情况中实现上述模式之一,但是这个实现可以很好地替换为pthreads和条件变量。 / p>

在解决并行问题时,我被教导要查看事物的方式是从抽象到具体这三个步骤:

  1. 确定适用的并行模式
  2. 确定实施模式的合适算法
  3. 确定合适的低级机制来实现算法
  4. 编辑:好的,看了看我的旧东西"我已经确定了一种可以使用AutoResetEvent实现的模式。有关问题的详细解释,请在此处查看我的旧问题:Parallel application has random behavior

    从描述中可以看出,在开始计算分配给它的行之前,每个线程必须等待一个伴随线程至少处理前一行的前几个项。这意味着每个线程必须在分配给它的每一行的开头处阻塞并等待信号。因此,假设我们有3个线程处理矩阵,线程0将在第0行,第3行,第6行...第1行,第4行,第7行等的第1行开始时阻塞,依此类推。

    这个等待发信号的行为可以使用每个线程AutoResetEvent轻松实现,因为每个线程需要阻塞几次,这意味着我们需要多次重置事件并且没有危险它会按顺序快速发出信号,因为线程必须等待彼此前进。