我是功能编程和Clojure的新手,所以我不确定如何为大学的项目做些什么。该项目应显示Clojure STM对银行交易的优势(从账户A转账到账户B)。 所以我打算这样做:
[
random-account-source-id(0, N_MAX) ,
random-account-destination-id(0, N_MAX), random-money (0, 1000) ]
for i=0; i lt N; i++;
synchronize: transfer (matrix[i].source,matrix[i].dest,matrix[i].money)
我不确定这个,然后,也许:
(defn do-all[]
(dosync
(when (pos? N)
(transfer (get matrix [pos 1], get matrix [pos 2], get matrix [pos 3])))))
答案 0 :(得分:6)
为每个帐户代表具有Ref,ref的帐户,并在dosync操作中执行汇款操作。还要确保在dosync操作中不进行任何副作用操作(除了那些参考),因为在更新refs时可能会发生冲突时重试。
<强>更新强> 如果您将修改帐户数量,那么您可以使用向量的ref,其中向量中的每个ref都是一个帐户,并且每个帐户都由向量中的索引标识。
例如:
(def total-accounts 100)
(def accounts (vec (map (fn [_] (ref 100)) (range total-accounts))))
如果您必须动态添加新帐户并按名称识别它们,则可以使用哈希映射,其中key是帐户ID(唯一值),value是帐户余额的Ref。如果您希望执行并行操作以从多个线程添加/删除帐户,则需要将此映射包装在Ref中。
答案 1 :(得分:4)
您可能对我在回复其他问题时发布的this example of Clojure's STM used for banking transactions感兴趣。