From 9477dbe667f250ecd23f8fc0d56b942191526421 Mon Sep 17 00:00:00 2001 From: Franciszek Malinka Date: Thu, 25 Feb 2021 14:42:55 +0100 Subject: Stare semestry, niepoukladane --- Semestr 2/racket/l15/kacp.bak | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Semestr 2/racket/l15/kacp.bak (limited to 'Semestr 2/racket/l15/kacp.bak') diff --git a/Semestr 2/racket/l15/kacp.bak b/Semestr 2/racket/l15/kacp.bak new file mode 100644 index 0000000..ff2a2bc --- /dev/null +++ b/Semestr 2/racket/l15/kacp.bak @@ -0,0 +1,55 @@ +#lang racket + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) + +(define (random-sleep) + (sleep (/ (random) 100))) + +(define (with-random-sleep proc) + (lambda args + (random-sleep) + (apply proc args))) + +(define (make-serializer) + (define sem (make-semaphore 1)) + (lambda (proc) + (lambda args + (semaphore-wait sem) + (define ret (apply proc args)) + (semaphore-post sem) + ret))) + +(define (table) + (random-sleep) + (define forks (list (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1))) + (define (pick-fork i) + (random-sleep) + (semaphore-wait (list-ref forks i))) + (define (put-fork i) + (random-sleep) + (semaphore-post (list-ref forks i))) + (define (dispatch m) + (cond [(eq? m 'pick-fork) pick-fork] + [(eq? m 'put-fork) put-fork] + [else (error "Unknown request -- TABLE" + m)])) + dispatch) + +(define dtable (table)) + +(define (philosopher dining-table number) + (define my-turn (make-serializer)) + (define (eat) + (display number) + (newline) + ((dining-table 'pick-fork) number) + ((dining-table 'put-fork) number) + ((dining-table 'pick-fork) (modulo (+ number 1) 5)) + ((dining-table 'put-fork) (modulo (+ number 1) 5))) + (my-turn eat)) \ No newline at end of file -- cgit v1.2.3