A programs starts off with one thread and may create more threads.
Threads synchronise by events .
Signalled events are associated with a value. A thread may wait for an event to be signalled by calling the wait procedure. The call to wait returns the value associated with the event when it becomes signalled. The thread is suspended until the event becomes signalled. If the event has already been signalled at the time of the call to wait then the call returns the associated value immediately.