10.2.2 Channels
A channel both synchronizes a pair of threads and passes a value from one to the other. Channels are synchronous; both the sender and the receiver must block until the (atomic) transaction is complete. Multiple senders and receivers can access a channel at once, but a single sender and receiver is selected for each transaction.
Channel synchronization is fair: if a thread is blocked on a channel and transaction opportunities for the channel occur infinitely often, then the thread eventually participates in a transaction.
For buffered asynchronous channels, see Buffered Asynchronous Channels.
(make-channel) → channel?
Creates and returns a new channel. The channel can be used with
channel-get, with channel-try-get, or as a
synchronizable event (see Events) to receive a value
through the channel. The channel can be used with channel-put
or through the result of channel-put-evt to send a value
through the channel.
(channel-get ch) → any ch : channel?
Blocks until a sender is ready to provide a value through
ch. The result is the sent value.
(channel-try-get ch) → any ch : channel?
Receives and returns a value from ch if a sender is
immediately ready, otherwise returns #f.
(channel-put ch v) → void? ch : channel? v : any/c
Blocks until a receiver is ready to accept the value v
through ch.
(channel-put-evt ch v) → evt? ch : channel? v : any/c
Returns a fresh synchronizable event for use with
sync. The event is ready when (channel-put ch v)
would not block, and the event’s synchronization result is the event
itself.