The following describes the typical situations in which the various synchronization techniques are used.
Mutex objects are used to stop two threads from attempting to access some shared resource at the same time. Critical sections can be used within a process.
Event objects are used to allow one or more threads to block until another thread has completed a task.
Semaphore objects are used when synchronized counting is required with some given maximum value.