1. #include <windows.h>
  2.  
  3. class CriticalSection
  4. {
  5. public:
  6.     CriticalSection()
  7.     {
  8.         InitializeCriticalSection(&m_cs);
  9.     }
  10.     ~CriticalSection()
  11.     {
  12.         DeleteCriticalSection(&m_cs);
  13.     }
  14.     void enterCriticalSection()
  15.     {
  16.         EnterCriticalSection(&m_cs);
  17.     }
  18.     void leaveCriticalSection()
  19.     {
  20.         LeaveCriticalSection(&m_cs);
  21.     }
  22. protected:
  23. private:
  24.     CRITICAL_SECTION m_cs;
  25. };
  26.  
  27. template<class T>
  28. class SharedMemory
  29. {
  30. public:
  31.     SharedMemory() { m_empty = true;}
  32.     ~SharedMemory() {}
  33.  
  34.     T getData(bool& validreturn)
  35.     {
  36.         m_cs.enterCriticalSection();
  37.         if (m_empty)
  38.         {
  39.             m_cs.leaveCriticalSection();
  40.             validreturn = false;
  41.             return T();
  42.         }
  43.         //Data in the shared memory
  44.         T data = m_data;
  45.         m_empty = true;
  46.         m_cs.leaveCriticalSection();
  47.         validreturn = true;
  48.         return data;
  49.     }
  50.     bool setData(const T& data)
  51.     {
  52.         m_cs.enterCriticalSection();
  53.         if (!m_empty)
  54.         {
  55.             m_cs.leaveCriticalSection();
  56.             return false;
  57.         }
  58.         //Shared memory is empty so fill it
  59.         m_data = data;
  60.         m_empty = false;
  61.         m_cs.leaveCriticalSection();
  62.         return true;
  63.     }
  64. protected:
  65. private:
  66.     T m_data;
  67.     bool m_empty;
  68.     CriticalSection m_cs;
  69. };