Mutex: Difference between revisions

5 bytes added ,  11 years ago
Line 645:
 
Racket has semaphores which can be used as mutexes in the usual way. With other language features this can be used to implement new features -- for example, here is how we would implement a protected-by-a-mutex function:
<lang Racketracket>(define foo
(define foo
(let ([sema (make-semaphore 1)])
(lambda (x)
Line 652 ⟶ 653:
(λ() (semaphore-post sema))))))</lang>
and it is now easy to turn this into a macro for definitions of such functions:
<lang racket>
<lang Racket>(define-syntax-rule (define/atomic (name arg ...) E ...)
(define name
(let ([sema (make-semaphore 1)])
(lambda (arg ...)
(dynamic-wind ( λ() (semaphore-wait sema))
( λ() E ...)
( λ() (semaphore-post sema)))))))
;; this does the same as the above now:
(define/atomic (foo x)