Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency Clojure';s ref与并发中的atom_Concurrency_Clojure - Fatal编程技术网

Concurrency Clojure';s ref与并发中的atom

Concurrency Clojure';s ref与并发中的atom,concurrency,clojure,Concurrency,Clojure,我有两个Clojure代码同时更改状态。 第一个使用atom的(第3-14行)似乎运行良好,而第二个使用ref的(第17和29行)显示随机结果。可能有什么问题 在期货交易完成之前,对最后的(deref acct1)(deref acct2)表格进行评估 而且,由于读取不协调,结果不一致;如果您编写了类似于(dosync[(deref acct1)(deref acct2)]的代码,那么总数将始终是2000 顺便说一下,我强烈建议您不要为这种并发性实验重新定义#transfer、#acct1和#a

我有两个Clojure代码同时更改状态。 第一个使用atom的(第3-14行)似乎运行良好,而第二个使用ref的(第17和29行)显示随机结果。可能有什么问题

在期货交易完成之前,对最后的
(deref acct1)(deref acct2)
表格进行评估

而且,由于读取不协调,结果不一致;如果您编写了类似于
(dosync[(deref acct1)(deref acct2)]
的代码,那么总数将始终是2000

顺便说一下,我强烈建议您不要为这种并发性实验重新定义
#transfer
#acct1
#acct2
变量;选择不同的名称:)

(ns learnclojure.core)

(def acct1 (atom 1000 :validator #(>= % 0)))
(def acct2 (atom 1000 :validator #(>= % 0)))

(defn transfer [from-ac to-ac amt]
  (swap! to-ac + amt)
  (swap! from-ac - amt))

(dotimes [_ 10]
  (future (transfer acct2 acct1 100)))

(deref acct1)
(deref acct2)


(def acct1 (ref 1000 :validator #(>= % 0)))
(def acct2 (ref 1000 :validator #(>= % 0)))

(defn transfer [from-ac to-ac amt]
  (dosync
    (alter to-ac + amt)
    (alter from-ac - amt)))

(dotimes [_ 10]
  (future (transfer acct2 acct1 100)))

(deref acct1)
(deref acct2)