ソフトウェアトランザクションメモリの構成可能性の例


11

常に言及されるソフトウェアトランザクションメモリの主な利点の1つは、構成可能性とモジュール性です。異なるフラグメントを組み合わせて、より大きなコンポーネントを作成できます。ロックベースのプログラムでは、多くの場合そうではありません。

これを実際のコードで説明する簡単な例を探しています。私はClojureの例を好むが、Haskellも大丈夫だ。サンプルが、簡単に構成できないロックベースのコードを示している場合のボーナスポイント。


1
興味深いですが、私にとってはStackOverflowの質問のようです。
スティーブ

この質問は4分後にそこで尋ねられました。stackoverflow.com/questions/5518546/…誰かがこの質問を移行してマージしますか(可能な場合)?
仕事

ええ、ここに投稿した後、Stackoverflowの方がおそらく良いと思いました。誰かがそれをマージできるなら、それは私と一緒です。
dbyrne

回答:


9

いくつかの銀行口座があるとします:

(def accounts 
 [(ref 0) 
  (ref 10) 
  (ref 20) 
  (ref 30)])

そして、アトミックな「転送」機能:

(defn transfer [src-account dest-account amount]
  (dosync
    (alter dest-account + amount)
    (alter src-account - amount)))

次のように機能します:

(transfer (accounts 1) (accounts 0) 5)

(map deref accounts)
=> (5 5 20 30)

その後、転送関数を簡単に作成して、たとえば複数のアカウントから転送するなど、より高いレベルのトランザクションを作成できます。

(defn transfer-from-all [src-accounts dest-account amount]
  (dosync
    (doseq [src src-accounts] 
      (transfer src dest-account amount))))

(transfer-from-all 
  [(accounts 0) (accounts 1) (accounts 2)] 
  (accounts 3) 
  5)

(map deref accounts)
=> (0 0 15 45)

複数の転送はすべて、単一の結合トランザクションで発生したことに注意してください。つまり、より小さいトランザクションを「構成」することができました。

アカウントを個別にロックする必要があると仮定すると、ロックを使用してこれを行うことは非常に迅速に複雑になります。検出が難しい間違いを犯すのは非常に簡単です。STMは、このような苦痛からあなたを救います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.