Код Ревью
Сравни свои решения
(define (make-semaphore n)
(let ((count n)
(mutex (make-mutex))
(mv (make-mutex)))
(define (acquire)
(mutex 'acquire)
(mv 'acquire)
(set! count (- count 1))
(when (> count 0)
(mutex 'release))
(mv 'release))
(define (release)
(mv 'acquire)
(when (= count 0)
(mutex 'release))
(when (< count n)
(set! count (+ count 1)))
(mv 'release))
(define (the-semaphore m)
(cond ((eq? m 'acquire) (acquire))
((eq? m 'release) (release))
((eq? m 'count) count)))
the-semaphore))
(define (make-semaphore n)
(let ((count n)
(mutex (make-mutex))
(mv (make-mutex)))
(define (acquire)
(mutex 'acquire)
(mv 'acquire)
(set! count (- count 1))
(when (> count 0)
(mutex 'release))
(mv 'release))
(define (release)
(mv 'acquire)
(when (= count 0)
(mutex 'release))
(when (< count n)
(set! count (+ count 1)))
(mv 'release))
(define (the-semaphore m)
(cond ((eq? m 'acquire) (acquire))
((eq? m 'release) (release))
((eq? m 'count) count)))
the-semaphore))
(define (make-semaphore n)
(let ((count n)
(mutex (make-mutex))
(mv (make-mutex)))
(define (acquire)
(mutex 'acquire)
(mv 'acquire)
(set! count (- count 1))
(when (> count 0)
(mutex 'release))
(mv 'release))
(define (release)
(mv 'acquire)
(when (= count 0)
(mutex 'release))
(when (< count n)
(set! count (+ count 1)))
(mv 'release))
(define (the-semaphore m)
(cond ((eq? m 'acquire) (acquire))
((eq? m 'release) (release))
((eq? m 'count) count)))
the-semaphore))
(define (make-semaphore n)
(let ((count n)
(mutex (make-mutex))
(mv (make-mutex)))
(define (acquire)
(mutex 'acquire)
(mv 'acquire)
(set! count (- count 1))
(when (> count 0)
(mutex 'release))
(mv 'release))
(define (release)
(mv 'acquire)
(when (= count 0)
(mutex 'release))
(when (< count n)
(set! count (+ count 1)))
(mv 'release))
(define (the-semaphore m)
(cond ((eq? m 'acquire) (acquire))
((eq? m 'release) (release))
((eq? m 'count) count)))
the-semaphore))