人们应该如何等待教堂里的条件成为现实?
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 值的最佳方法(或最惯用的方法)是什么?
我想到了几个不同的选项(其中一些不起作用):
一个没有主体的简单 while 循环 -- 这会锁定任务,还是 Chapel 有时会从 while 循环中退出?此外,我假设正确的程序是在 i
的语言环境中执行 while 循环。
使用原子和 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)
,但目前不支持。
考虑以下简化情况——任务 A 递增计数器 i
(同时可能还做一些工作),而任务 B 需要在 i
达到特定值时开始其任务。任务 A 不知道 B 的存在,所以我不能假设 A 可以在满足条件时向 B 发出信号。但是 B 可以读取 i
,尽管 i
很可能对 B 很遥远。
B 检查 i
是否具有 reached/crossed 值的最佳方法(或最惯用的方法)是什么?
我想到了几个不同的选项(其中一些不起作用):
一个没有主体的简单 while 循环 -- 这会锁定任务,还是 Chapel 有时会从 while 循环中退出?此外,我假设正确的程序是在
i
的语言环境中执行 while 循环。使用原子和 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)
,但目前不支持。