huangzworks / SICP-answers

我的 SICP 解题集
http://sicp.readthedocs.org/
882 stars 183 forks source link

练习3.47的疑问 这里在release的时候是不是也需要给n加锁 还是说默认这里的set!就是原子化的 #61

Open DaveAimee opened 5 years ago

DaveAimee commented 5 years ago

;;; 47-semaphore-using-test-and-set.scm

(define (make-semaphore n)

(define (acquire)
    (if (test-and-set! n)
        (acquire)
        'ok))

(define (release)
    (set! n (+ n 1))
    'ok)

(define (dispatch mode)
    (cond ((eq? mode 'acquire)
            (acquire))
          ((eq? mode 'release)
            (release))
          (else
            (error "Unknown mode MAKE-SEMAPHORE" mode))))

dispatch)

(define (test-and-set! n) (if (= n 0)

t

    (begin (set! n (- n 1))
           #f)))

|

; 根据注释 174 ; 以下是一个可以在采用时间片模型的单处理器的 MIT Scheme 里实际运行的 test-and-set!

(define (test-and-set! n) (without-interrupts (lambda () (if (= n 0)

t

            (begin (set! n (- n 1))
                   #f)))))

|#