LockMRSW.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:1k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // LockMRSW.cpp: implementation of the CLockMRSW & CLockMRSW2 class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "LockMRSW.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // CLockMRSW Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. CLockMRSW::CLockMRSW()
  10. : m_eventIdle(::CreateEvent(NULL, TRUE, TRUE, NULL)), m_lUsing(-1L)
  11. {
  12. ::InitializeCriticalSection(&m_csModi);
  13. ::InitializeCriticalSection(&m_csExclusive);
  14. }
  15. CLockMRSW::~CLockMRSW()
  16. {
  17. ::DeleteCriticalSection(&m_csExclusive);
  18. ::DeleteCriticalSection(&m_csModi);
  19. ::CloseHandle(m_eventIdle);
  20. }
  21. void CLockMRSW::EnterRead()
  22. {
  23. ::EnterCriticalSection(&m_csExclusive);
  24. ::EnterCriticalSection(&m_csModi);
  25. if (++m_lUsing == 0)
  26. ::ResetEvent(m_eventIdle);
  27. ::LeaveCriticalSection(&m_csModi);
  28. ::LeaveCriticalSection(&m_csExclusive);
  29. }
  30. void CLockMRSW::LeaveRead()
  31. {
  32. ::EnterCriticalSection(&m_csModi);
  33. if (--m_lUsing < 0)
  34. ::SetEvent(m_eventIdle);
  35. ::LeaveCriticalSection(&m_csModi);
  36. }
  37. void CLockMRSW::EnterWrite()
  38. {
  39. ::EnterCriticalSection(&m_csExclusive);
  40. ::WaitForSingleObject(m_eventIdle, INFINITE);
  41. }
  42. void CLockMRSW::LeaveWrite()
  43. {
  44. ::LeaveCriticalSection(&m_csExclusive);
  45. }