Contoh Kompabilitas Memori Transaksional Perangkat Lunak

11

Salah satu keunggulan utama dari memori transaksional perangkat lunak yang selalu disebutkan adalah kompabilitas dan modularitas. Fragmen yang berbeda dapat digabungkan untuk menghasilkan komponen yang lebih besar. Dalam program berbasis kunci, ini sering tidak terjadi.

Saya mencari contoh sederhana yang menggambarkan ini dengan kode aktual. Saya lebih suka contoh di Clojure, tetapi Haskell juga baik-baik saja. Poin bonus jika contoh ini juga memperlihatkan beberapa kode berbasis kunci yang tidak dapat dibuat dengan mudah.

dbyrne
sumber
1
Menarik, tetapi terdengar lebih seperti pertanyaan StackOverflow bagi saya.
Steve
Pertanyaan ini telah ditanyakan di sana 4 menit kemudian. stackoverflow.com/questions/5518546/… Apakah seseorang akan bermigrasi dan menggabungkan pertanyaan ini (jika mungkin)?
Pekerjaan
Ya setelah saya diposting di sini, saya menyadari mungkin akan lebih baik di Stackoverflow. Jika seseorang dapat menggabungkannya, itu tidak masalah bagi saya.
dbyrne

Jawaban:

9

Misalkan Anda memiliki beberapa rekening bank:

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

Dan fungsi "transfer" atom:

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

Yang berfungsi sebagai berikut:

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

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

Anda kemudian dapat dengan mudah menyusun fungsi transfer untuk membuat transaksi tingkat yang lebih tinggi, misalnya mentransfer dari beberapa akun:

(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)

Perhatikan bahwa semua transfer berganda terjadi dalam satu transaksi tunggal, yaitu mungkin untuk "menyusun" transaksi yang lebih kecil.

Untuk melakukan ini dengan kunci akan menjadi rumit dengan sangat cepat: dengan asumsi akun perlu dikunci secara individual maka Anda perlu melakukan sesuatu seperti membuat protokol pada pesanan akuisisi kunci untuk menghindari kebuntuan. Sangat mudah untuk membuat kesalahan yang sulit dideteksi. STM menyelamatkan Anda dari semua rasa sakit ini.

mikera
sumber