#include class CriticalSection { public: CriticalSection() { InitializeCriticalSection(&m_cs); } ~CriticalSection() { DeleteCriticalSection(&m_cs); } void enterCriticalSection() { EnterCriticalSection(&m_cs); } void leaveCriticalSection() { LeaveCriticalSection(&m_cs); } protected: private: CRITICAL_SECTION m_cs; }; template class SharedMemory { public: SharedMemory() { m_empty = true;} ~SharedMemory() {} T getData(bool& validreturn) { m_cs.enterCriticalSection(); if (m_empty) { m_cs.leaveCriticalSection(); validreturn = false; return T(); } //Data in the shared memory T data = m_data; m_empty = true; m_cs.leaveCriticalSection(); validreturn = true; return data; } bool setData(const T& data) { m_cs.enterCriticalSection(); if (!m_empty) { m_cs.leaveCriticalSection(); return false; } //Shared memory is empty so fill it m_data = data; m_empty = false; m_cs.leaveCriticalSection(); return true; } protected: private: T m_data; bool m_empty; CriticalSection m_cs; };