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