Racket’s synchronization toolbox spans four layers:
synchronizable events — a general framework for synchronization;
channels — a primitive that can be used, in principle, to build most other kinds of synchronizable events (except the ones that compose events); and
semaphores — a simple and especially cheap primitive for synchronization.
future semaphores — a simple synchronization primitive for use with futures.