人们应该如何等待教堂里的条件成为现实?

How should one wait for a condition to become true in Chapel?

考虑以下简化情况——任务 A 递增计数器 i(同时可能还做一些工作),而任务 B 需要在 i 达到特定值时开始其任务。任务 A 不知道 B 的存在,所以我不能假设 A 可以在满足条件时向 B 发出信号。但是 B 可以读取 i,尽管 i 很可能对 B 很遥远。

B 检查 i 是否具有 reached/crossed 值的最佳方法(或最惯用的方法)是什么?

我想到了几个不同的选项(其中一些不起作用):

  1. 一个没有主体的简单 while 循环 -- 这会锁定任务,还是 Chapel 有时会从 while 循环中退出?此外,我假设正确的程序是在 i 的语言环境中执行 while 循环。

  2. 使用原子和 waitFor 方法——不幸的是,这不起作用,因为 i 可能已经超过了感兴趣的值。

它有点难看,但您可以实现 waitFor() 的细微变化。类似于:

on i {
  while i.read() < valueOfInterest {
    chpl_task_yield();
  }
}

请注意,您必须自己明确地执行 chpl_task_yield()。 Chapel 不会自动将 yield 插入循环或任何东西中。

你也可以做一个包装器:

proc waitUntil(i, valueOfIterest) where isAtomic(i) {
  on i {
    while i.read() < valueOfIterest {
      chpl_task_yield();
    }
  }
}
waitUntil(i, valueOfInterest);

理想情况下,签名更像 proc waitUntil(i: atomic(?t), valueOfInterest: t),但目前不支持。