Chapter 6 demonstrates the different synchronization mechanisms
available in the Win32 API. The MFCSYNC directory contains
an example that shows how to use these mechanisms in an MFC
program without stalling the event loop.

BUFFER.CPP
  This code demonstrates a solution to the bounded buffer
  problem using semaphores.

CRITSEC.CPP
  This code demonstrates the use of a critcal section to
  synchronize threads.

DINPHIL.CPP
  This code demonstrates the dining philosophers problem that
  can fail due to deadlock.

DINPHIL2.CPP
  This code demonstrates a solution to the dining philosopher
  problem that cannot deadlock.

EVENT.CPP
  This code demonstrates the use of an event to synchronize
  threads.

FILEFIND.CPP
  This code demonstrates the use of asynchronous change
  functions.

FILEOVEX.CPP
  This code demonstrates the use of completion routines.

FILEOVLP.CPP
  This code demonstrates the use of overlapped file I/O.

MAKEFILE
  Change the APP variable in the makefile to compile the
  different examples in this directory.

MUTEX.CPP
  This code demonstrates the use of a mutex to synchronize
  threads.

MUTEX2.CPP
  This code demonstrates how separate threads can open
  a mutex. Compare to mutex.cpp.

PROB1.CPP
  This code demonstrates a simple problem that arises when  
  threads in a multi-threaded applications interact with
  one another through a shared resource.

PROB2.CPP
  This code shows normal implementations for a stack's push
  and pop operations that fail when used in a multi-threaded
  environment.

RW.CPP
  This code demonstrates a solution to the reader-writer
  problem.

SEMA.CPP
  This code demonstrates the use of a semaphore to
  synchronize threads.

