1

msdn 自动重置事件

问题

哪种并行模式最适合 AutoResetEvent?

背景

在比较线程之间的同步选项时,我们可能会AutoResetEvent比较ManualResetEvent. 考虑这两个区别:

  1. AutoResetEvent 最多释放一个等待线程。
  2. AutoResetEvent在一个等待线程被释放后自动重置。

重要的是要注意,如果两个线程正在等待并且一个AutoResetEvent触发两次,则可能会发生竞争条件并且只释放一个线程。可以使用更多的锁来防止这种情况 - 但问题的重点是关于哪种模式AutoResetEvent最适合(也许这意味着它本身最支持哪种模式)。

4

1 回答 1

0

我不确定在这种情况下我们是否可以谈论并行模式。模式比单纯的同步机制(例如AutoResetEvent.

当我们谈到并行模式时,我们指的是解决常见并行性问题的通用方法,例如数据结构的几何分解、并行分治、生产者-消费者等,这些方法可以通过一系列较低的具体实现级别机制,并且与语言和平台无关。

AutoResetEvent是一种.NET 同步机制。它可以与类一起用于在具体案例Thread中实现上述模式之一,但是这种实现可以很好地替换为例如 pthread 和条件变量。

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

  1. 确定适用的平行模式
  2. 确定一个合适的算法来实现模式
  3. 确定合适的低级机制来实现算法

编辑:好的,在查看了我的旧“东西”之后,我发现了一种可以使用AutoResetEvent. 要很好地解释问题,请查看我的旧问题:并行应用程序具有随机行为

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

这种等待发出信号的行为可以很容易地使用AutoResetEvent每个线程来实现,因为每个线程都需要多次阻塞,这意味着我们需要多次重置事件并且不存在按顺序快速发出信号的危险,因为线程必须等待彼此前进。

于 2012-07-06T19:33:44.480 回答