【发布时间】:2014-04-16 03:41:49
【问题描述】:
在 Clojure 中,如何阻塞线程(未来)直到条件变为真?或者,或者,也许继续重试直到条件变为真?当您有条件变量时,这很容易,但我不确定 Clojure 的方法是什么。
更具体地说,我有一个共享变量,许多期货可以同时访问它。未来应该做到以下几点:
- 检查变量的状态。
- 如果状态满足特定条件,则将其更新为新状态。
- 如果状态不满足条件,future 应该阻塞或重试,直到满足条件(由另一个线程修改状态)。
【问题讨论】:
-
我碰巧查看了#clojure 日志,看来您实际上对共享资源由使用它的线程独占,然后返回到“可用”的场景感兴趣" 一旦当前线程不再需要它,下一个线程将拾取它的状态。您可以使用 core.async 使用具有大小为 1 的缓冲区的通道来执行此操作: (1) 创建通道 --
(chan 1),将其放在适当的位置 -- 并将资源放在通道上; (2) 使用(<!! the-channel)请求对资源的独占保留(阻塞); (3) 完成后,用>!!返回资源。
标签: concurrency clojure