考虑以下简化情况 - 任务A递增计数器i
(可能也做一些工作),而任务B需要在i
达到特定值时开始其任务。任务A不知道B的存在,所以我不能假设当条件满足时A可以向B发信号。然而,B可以读i
,但i
可能远离B。
B检查i
是否达到/超过某个值的最佳方式(或最惯用的方式)是什么?
我想到了一些不同的选择(其中一些不起作用):
一个简单的while循环,没有正文 - 这会锁定任务,还是Chapel有时会从while循环中产生?另外,我假设正确的程序是在i
的语言环境中执行while循环。
使用atomics和waitFor方法 - 遗憾的是,这不起作用,因为i
已经超过了感兴趣的值。
答案 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)
,但今天不支持。