(use srfi-18 srfi-69 synch miscmacros) (define-record-type foo (make-foo x y mtx) foo? (x foo-x) (y foo-y) (mtx foo-mutex)) (define tfoo (make-foo 1 2 (make-mutex))) (print "*** prints 1 2 ***") (record/synch foo tfoo (print (foo-x tfoo) " " (foo-y tfoo))) (newline) ;; (define (hash-table-count ht) (##sys#check-structure ht 'hash-table 'hash-table-count) (hash-table-fold ht (lambda (k v a) (fx+ a 1)) 0) ) ;;; (define-constructor/synch make-hash-table hash-table/synch:) (define-predicate/synch hash-table?) (define-operation/synch hash-table-count) (define-operation/synch hash-table-set!) ;; (define +tht+ (make-hash-table/synch = number-hash)) ;; Greedy reader (define (reader) (do ((n (hash-table-count/synch +tht+) (hash-table-count/synch +tht+))) ((fx= 20 n) (print "test hash-table count = " n " so quit")) (print "test hash-table count = " n) ) ) (define reader-thread (make-thread reader 'reader)) (thread-start! reader-thread) ;; Cooperative writer (define (writer) (repeat* 10 (hash-table-set!/synch +tht+ it (number->string it)) (hash-table-set!/synch +tht+ (* it 11) (number->string it)) (thread-yield!) ) ) (define writer-thread (make-thread writer 'writer)) (thread-start! writer-thread) ;; (thread-join! writer-thread) (thread-join! reader-thread)