A side effect of the adoption of task-based scheduling is the need for task communication and synchronization. All operating systems invariably provide a rich selection of communication and synchronization primitives but, without a solid theoretical background, it is easy to misuse them and introduce subtle, time-dependent errors in the software.