SICPゼミ第24回

練習問題3.46

スレッド1が(car cell)した結果falseが返ってくる→スレッド1が(set-car! cell true)する前にスレッド2が(car cell)してfalseを得る→同時に2つのスレッドがmutexを獲得できたものとして実行されてしまう。

練習問題3.47

(a)

(define (make-semaphore n)
  (let ((counter 0) (m (make-mutex)))
    (define (the-semaphore ord)
      (cond
        ((eq? ord 'acquire)
          (begin (m 'acquire)
            (if (< counter n) (begin (set! counter (+ counter 1)) (m 'release))
              (begin (m' release) (the-semaphore 'acquire)))
            ))
        ((eq? ord) (begin (m' acquire) (set! counter (- counter 1)) (m' release))))
       the-semaphore))

by dolicas

(b)

(define (make-semaphore)
  (let ((cell (make-cell n)))
    (define (list-test-and-set! cell)
      (if (test-and-set! cell)
          (if (null? (cdr cell))
              (the-semaphore 'acquire )
              (list-test-and-set! (cdr cell)))
          #f))
    (define (the-semaphore m)
      (cond ((eq? m 'acquire)
             (list-test-and-set! cell))
            ((eq? m 'release) (clear-cell! cell ))))
    the-semaphore ))
  
(define (make-cell n)
  (if (= n 0)
      '()
      (cons #f (make-cell (- n 1)) )))

clear-cell! は無理。

by tube