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

标签 multithreading model-view-controller clojure identity

总的来说,我对 Clojure 和 LISP 相当陌生,所以如果这个问题听起来有点傻,请提前原谅。我最近以 MVC 方式用 Java 创建了一个回合制视频游戏,其中一个线程负责图形循环(因此,以固定速率更新屏幕上图形实体的几何状态),另一个线程负责处理游戏的逻辑状态;它的行为非常像一个守护进程:除非被要求做某事(详细的用户输入),否则在后台“ sleep ”,然后将“更改日志”传递到图形线程,以便它可以呈现对逻辑状态所做的更改。因此,游戏世界根本不是“共享”的:只有逻辑线程可以访问它,图形线程的唯一职责是在初始化阶段之后以及当新的更改日志从逻辑线程到达时将更改应用于渲染.

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

最佳答案

就您而言,不需要并发访问,因此任何选项都是有效的。

ref 是这个问题的过度解决。 var 通常不会在这种情况下使用(通常 var 重新绑定(bind)用于可配置参数,而不是您案例中的业务逻辑)。所以atom应该没问题。

编辑:(详细说明var)

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

由于只有一个线程处理“board”数据,因此无论如何使用 var 都是可以的,但对我来说这看起来有点奇怪。当看到 var 如此频繁地更改时,我感到有点沮丧。 :)

关于multithreading - 在这种情况下,我应该如何处理 Clojure 中的可变状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864522/

相关文章:

clojure - 如何使用 lein doo phantom 使用 cljs-http 测试 http 请求

c# - 每 n 秒调用一次存储过程

c - memcpy 中的奇怪核心转储

clojure - 如何在 clojure 中的 HashMap 上插入 if

asp.net-mvc - 使用 VB.net 2008 开始 ASP.NET MVC

javascript - 如何从Angularjs中的不同文件调用服务

clojure - 如何在 clojure repl 中使用 java.time? Java 互操作找不到类

java - 后台线程抛出 HibernateException - "No Hibernate Session bound to thread..."

java - 对必须手动中断的异步计算进行单元测试

iphone - iOS Controller 问题