欢迎!请参阅关于页面以了解更多相关信息。
这个问题在这里被提出:https://groups.google.com/d/topic/clojure/w_p4f3gNo3s/discussion另一个(可能)相关的先前讨论:https://groups.google.com/d/topic/clojure-dev/9Ai-ZuCezOY/discussion
场景1. 一个通道有一个固定大小为1的缓冲区和扩展转置器(mapcat identity)2. 在另一个线程中执行一个带有集合(C1)的单次put!操作3. 启动一个阻塞的take!操作4. 在另一个线程中执行带有另一个集合的第二次put!操作
(mapcat identity)
我预期任何put!操作都将失败,直到从通道中取出集合C1的所有元素。
非阻塞的put!操作(通过offer!)在这种情况下也会失败。
阻塞的put!操作会阻塞,但直到通道上执行一次单独的take!操作。这是令人惊讶的。put!的值去哪里了?一切似乎都“按预期”继续工作,但缓冲区似乎像增长到了大小2(2个输入集合,1个通过转置器部分输出)
我认为这是通过在调用(impl/remove! buffer)之后以及在处理任何puts之前检查缓冲区是否已满来解决的。请参阅补丁以了解我确切的意思。我不太熟悉这个代码库;尽管测试通过了。
(impl/remove! buffer)
由brianru发表的评论:
用包含演示更改前后行为的测试的补丁替换了补丁。