考虑以下简化的情况 - 任务 A 递增计数器i
(同时可能还会做一些工作(,而任务 B 需要在i
达到特定值时启动其任务。任务 A 忘记了 B 的存在,所以我不能假设 A 可以在满足条件时向 B 发出信号。然而B可以读取i
,尽管i
对B来说很可能很遥远。
B检查i
是否达到/越过一个值的最佳方法(或最惯用的方法(是什么?
我想到了几个不同的选项(其中一些不起作用(:
- 一个简单的 while 循环,
没有正文 -- 这是锁定任务,还是 Chapel 有时会从 while 循环中产生?另外,我认为正确的过程是在
i
的语言环境中执行while循环。使用原子学和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)
,但今天不支持。