4

私は関数型プログラミングとClojureを初めて使用するので、大学でのプロジェクトで何をすべきかよくわかりません。プロジェクトは、銀行取引(口座Aから口座Bへの送金)におけるClojureSTMの利点を示す必要があります。だから私はこのように進めることを計画しています:

  1. 参照のマトリックスなどの初期データを定義する
  2. 実行するランダム操作を生成します。[ random-account-source-id(0, N_MAX) , random-account-destination-id(0, N_MAX), random-money (0, 1000) ]
  3. トランザクションをデータ構造に挿入します
  4. 次のようなマトリックスへのすべての挿入について、source-idからdestination-idへの送金を同期します。
    
    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])))))
4

2 に答える 2

6

アカウントをRef、つまり各アカウントのRefで表し、dosync操作で送金操作を実行します。また、参照の更新中に競合が発生した場合に再試行される可能性があるため、dosync操作で(これらの参照以外の)副作用操作を実行しないようにしてください。

更新: アカウントの数を固定する場合は、ベクターのrefを使用できます。ここで、ベクター内の各refはアカウントであり、各アカウントはベクター内のインデックスによって識別されます。

元:

(def total-accounts 100)
(def accounts (vec (map (fn [_] (ref 100)) (range total-accounts))))

新しいアカウントを動的に追加して名前で識別する必要がある場合は、ハッシュマップを使用できます。ここで、keyはアカウントID(一意の値)であり、valueはアカウント残高の参照です。複数のスレッドからアカウントを追加/削除するための同時操作を実行する場合は、このマップをRefでラップする必要があります。

于 2012-03-03T15:32:05.920 に答える
4

別の質問に答えて投稿した銀行取引に使用されるClojureのSTMのこの例に興味があるかもしれません。

于 2012-03-04T01:37:28.663 に答える