Приклад комбінованості пам'яті транзакційної програми


11

Однією з головних переваг транзакційної пам'яті програмного забезпечення, яка завжди згадується, є компостування та модульність. Для отримання більших компонентів можна комбінувати різні фрагменти. У програмах на основі блокування це часто не так.

Я шукаю простий приклад, що ілюструє це фактичним кодом. Я вважаю за краще приклад у Clojure, але Haskell теж добре. Бонусний бал, якщо приклад також містить якийсь код на основі блокування, який неможливо скласти легко.


1
Цікаво, але мені це більше нагадує питання StackOverflow.
Стів

Це питання було задано там через 4 хвилини. stackoverflow.com/questions/5518546/… Чи міг би хтось мігрувати та об'єднати це питання (якщо можливо)?
робота

Так, після того як я розмістив його тут, я зрозумів, що, мабуть, буде краще на Stackoverflow. Якщо хтось може це злити, це зі мною добре.
дбирне

Відповіді:


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 рятує вас від усього цього болю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.