如何在教堂等待条件成为现实?

时间:2018-02-02 21:24:48

标签: chapel

考虑以下简化情况 - 任务A递增计数器i(可能也做一些工作),而任务B需要在i达到特定值时开始其任务。任务A不知道B的存在,所以我不能假设当条件满足时A可以向B发信号。然而,B可以读i,但i可能远离B。

B检查i是否达到/超过某个值的最佳方式(或最惯用的方式)是什么?

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

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

  2. 使用atomics和waitFor方法 - 遗憾的是,这不起作用,因为i已经超过了感兴趣的值。

1 个答案:

答案 0 :(得分:4)

这有点难看,但你可以实现waitFor()的轻微变化。类似的东西:

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

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

你也可以制作一个包装器:

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),但今天不支持。