一个人应该如何等待一个条件在教堂里成为现实



考虑以下简化的情况 - 任务 A 递增计数器i(同时可能还会做一些工作(,而任务 B 需要在i达到特定值时启动其任务。任务 A 忘记了 B 的存在,所以我不能假设 A 可以在满足条件时向 B 发出信号。然而B可以读取i,尽管i对B来说很可能很遥远。

B检查i是否达到/越过一个值的最佳方法(或最惯用的方法(是什么?

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

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

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

它有点丑陋,但你可以实现 waitFor(( 的轻微变化。像这样:

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

请注意,您必须自己明确执行chpl_task_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),但今天不支持。

相关内容

  • 没有找到相关文章

最新更新