;; Die ersten drei Zeilen dieser Datei wurden von DrRacket eingefügt. Sie enthalten Metadaten ;; über die Sprachebene dieser Datei in einer Form, die DrRacket verarbeiten kann. #reader(lib "DMdA-assignments-reader.ss" "deinprogramm")((modname concurrent-account) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) (define balance 130) (define withdraw (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money")))) ; Schütze den kritischen Bereich mit einem Semaphor: (define s (make-semaphore)) (define secure-withdraw (lambda (amount) (begin (P s) (withdraw amount) (V s)))) ; Eine Bankkonto mit lokalem Kontostand + eigenem Semaphor: (define make-account (lambda (balance) (letrec ((as (make-semaphore)) (withdraw (lambda (amount) (begin (P as) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money")) (V as)))) (deposit (lambda (amount) (begin (P as) (begin (set! balance (+ balance amount)) balance) (V as)))) ...)))) ; Geldüberweisung von einem Konto zu einem anderen: ; Parameter: Konten und deren Semaphore (define transer-money (lambda (from-acc to-acc from-sem to-sem) (begin (P from-sem) (P to-sem) (deposit to-acc) (withdraw from-acc) (V to-sem) (V from-sem)) ))