gpt4 book ai didi

clojure - 这个 clojure sleep 理发师解决方案中是否存在错误?

转载 作者:行者123 更新时间:2023-12-05 01:08:41 24 4
gpt4 key购买 nike

这是作为 sleeping barber problem 的解决方案提出的。 . (归于 CGrand,但我找到了引用 here )

yanked from cgrand

我很好奇 dosync阻止 enter-the-shop .我的理解是这是一笔交易,所以empty-seats由于 STM,将保持一致。但是,不存在send-off的可能性吗?如果事务被重试,会被多次调用?如果不是,为什么,如果是,如何解决?

更新

虽然公认的答案仍然正确,但我刚刚注意到的一件事是可以进行优化——没有理由调用 send-off交易里面。一旦你有了交易的返回值,就可以事后发送,如下:

(if (dosync
(when (pos? @empty-seats)
(alter empty-seats dec)))
(send-off barber cut-hair n)
(debug "(s) turning away customer" n))

有趣的是,我在处理 Haskell equivalent 时发现了这一点。 ,这迫使您对 STM 内部和 STM 外部的“代理”使用不同的类型。上面的原始解决方案无法编译,因为它们必须要么都在事务中,要么都在任何事务之外。 (我的第一 react 是将它们都放入事务中,直到我意识到没有必要这样做并且它们都可以被提取)。

我认为修改后的事务应该更好,因为它可以更快地关闭事务,从事务中删除一个变量,并且我认为更容易阅读(甚至不需要怀疑它被发送两次的可能性——这实际上使得这整个问题没有实际意义)不过,无论如何,我还是把这个问题留给任何需要了解 STM 和代理如何交互的人。

最佳答案

引用 clojure.org page on agents :

Agents are integrated with the STM - any dispatches made in a transaction are held until it commits, and are discarded if it is retried or aborted.



所以 send-off当(/如果)STM事务成功提交时,只会运行一次。

关于clojure - 这个 clojure sleep 理发师解决方案中是否存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16781933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com