欢迎!请参阅关于页面以了解更多关于如何使用本站的信息。
没有挂起项时关闭汇合器是可以的,但关闭带有挂起项的汇合器会阻塞多输入通道
(require '[clojure.core.async :refer :all]) (def c (chan)) (def m (mult c)) (def t (chan)) (tap m t) (>!! c :a) (close! t) (>!! c :b) ; BLOCKS
评论由:klauswuestefeld
一个更通用的情况
执行以下操作
(go (println (>! c 42)))
然后关闭c会导致>!阻塞,而不是返回false。
如果在此之前关闭了c,>将返回false。
这个竞争条件是预期的行为吗?
评论由:andrewhr
据我理解,close!的实现遵循所有的take并在执行各自的回调以释放之前。
close!
take
我的方法是对put执行同样的操作,因此我们确保先前停泊的put将被释放 - 如本错误的通用情况所演示。
put
在相同的补丁中,我添加了一个测试用例以确保这种行为,并将相同的代码移植到ClojureScript实现。我可以在不同的补丁中将这两个实现分开,但我认为将所有内容放在一起会更便于审查。