在这种情况下,我应该如何处理Clojure中的可变状态?

时间:2016-03-08 10:13:02

标签: multithreading model-view-controller clojure identity

我对Clojure和LISP一般都很新,所以如果这个问题听起来有些愚蠢,请原谅我。我最近用MVC方式在Java中创建了一个基于回合的视频游戏,其中一个线程负责图形循环(因此,以固定速率更新屏幕上图形实体的几何状态),以及第二个负责的线程处理游戏的逻辑状态;它的作用就像一个守护进程:在后台“休眠”,除非要求做某事(精心设计的用户输入),然后向图形线程发送“更改日志”,以便它可以呈现对逻辑状态所做的更改。所以游戏世界根本没有“共享”:只有逻辑线程可以访问它,而图形线程的唯一职责是在初始化阶段之后以及当从逻辑线程到达新的更改日志时对渲染应用更改

我读过Clojure有vars,refs和atoms。在这种情况下,我应该使用哪一种身份来将我的游戏世界状态存储在Clojure的逻辑线程中?

1 个答案:

答案 0 :(得分:4)

在您的情况下,不需要并发访问,因此任何选项都有效。

ref是此问题的超调。 var通常不用于这种情况(通常var重新绑定用于可配置参数,而不是您的情况下的业务逻辑)。所以atom应该没问题。

编辑:(详见var

var,当声明为^:dynamic(通常为*earmuffed*)时,是线程本地的。它可以有一个根绑定,每个线程可以将它重新绑定到一个新的线程本地值。因此,您可以在clojure代码仓库中看到的var的典型用法是*warn-on-reflection**unchecked-math*等。它们大多以某种方式调整代码的行为。

因为你只有一个线程适用于" board"数据,它确定无论如何都要使用var,但对我来说这看起来有点奇怪。当看到var被频繁更改时,我有点不高兴。 :)