;; 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 withdraw-concurrent) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) (define withdraw (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money!")))) ; Implementierung mit Semaphoren: (define s (make-semaphore)) (define make-withdraw (lambda (amount) (begin (P s) (withdraw amount) (V s)))) ; Eigene Semaphore für jedes Konto: (define make-account (lambda (balance) (letrec ((s (make-semaphore)) (withdraw (lambda (amount) (begin (P s) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money!")) (V s)))) ...)))) ; Überweisung zwischen zwei Bankkonten: ; Parameter: zwei Bankkonten und ihre Semaphore (define transfer (lambda (a1 a2 s1 s2) (begin (P s1) (P s2) ...Überweisung ausführen... (V s2) (V s1))))