77 lines
1.8 KiB
Racket
77 lines
1.8 KiB
Racket
#lang typed/racket
|
|
(require typed/racket/async-channel)
|
|
|
|
;; same as threads-and-channels.rkt, but with async-channels
|
|
|
|
(: chan (Async-Channelof Symbol))
|
|
(define chan (make-async-channel))
|
|
|
|
(define (reader)
|
|
(thread
|
|
(lambda ()
|
|
(let loop : True ((i : Integer 10))
|
|
(if (= i 0)
|
|
#t
|
|
(begin (async-channel-get chan)
|
|
(loop (- i 1))))))))
|
|
|
|
(: writer (Symbol -> Thread))
|
|
(define (writer x)
|
|
(thread
|
|
(lambda ()
|
|
(async-channel-put chan x)
|
|
(async-channel-put chan x))))
|
|
|
|
(reader)
|
|
(writer 'a)
|
|
(writer 'b)
|
|
(writer 'c)
|
|
(writer 'd)
|
|
(writer 'e)
|
|
|
|
|
|
(define-type JumpingChannel (Rec JumpingChannel (Async-Channelof (Pair JumpingChannel Symbol))))
|
|
(: jump-chan JumpingChannel)
|
|
(define jump-chan (make-async-channel))
|
|
|
|
(define (jumping-reader)
|
|
(thread
|
|
(lambda ()
|
|
(let loop : True ((i : Integer 3)
|
|
(c : JumpingChannel jump-chan))
|
|
(if (= i 0)
|
|
#t
|
|
(loop (- i 1)
|
|
(car (async-channel-get c))))))))
|
|
|
|
(jumping-reader)
|
|
(let ((c2 : JumpingChannel (make-async-channel)))
|
|
(async-channel-put jump-chan (cons c2 'a))
|
|
(let ((c3 : JumpingChannel (make-async-channel)))
|
|
(async-channel-put c2 (cons c3 'b))
|
|
(let ((c4 : JumpingChannel (make-async-channel)))
|
|
(async-channel-put c3 (cons c4 'c)))))
|
|
|
|
|
|
|
|
|
|
(: tc (Thread-Cellof Integer))
|
|
(define tc (make-thread-cell 0))
|
|
|
|
(thread-cell-set! tc 1)
|
|
|
|
(thread-wait (thread (lambda ()
|
|
(displayln (thread-cell-ref tc))
|
|
(thread-cell-set! tc 2)
|
|
(displayln (thread-cell-ref tc)))))
|
|
|
|
(thread-cell-ref tc)
|
|
|
|
(define blocked-thread
|
|
(thread (lambda ()
|
|
(async-channel-get ((inst make-async-channel 'unused))))))
|
|
|
|
|
|
(thread-suspend blocked-thread)
|
|
(kill-thread blocked-thread)
|