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

模拟服务器

开发平台:

C/C++

  1. // Lock.cpp: implementation of the CLockXXXX class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Lock.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // CLockSRSW Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. CLockSRSW::CLockSRSW()
  10. {
  11. ::InitializeCriticalSection(&m_csExclusive);
  12. }
  13. CLockSRSW::~CLockSRSW()
  14. {
  15. ::DeleteCriticalSection(&m_csExclusive);
  16. }
  17. void CLockSRSW::EnterRead()
  18. {
  19. ::EnterCriticalSection(&m_csExclusive);
  20. }
  21. void CLockSRSW::LeaveRead()
  22. {
  23. ::LeaveCriticalSection(&m_csExclusive);
  24. }
  25. void CLockSRSW::EnterWrite()
  26. {
  27. ::EnterCriticalSection(&m_csExclusive);
  28. }
  29. void CLockSRSW::LeaveWrite()
  30. {
  31. ::LeaveCriticalSection(&m_csExclusive);
  32. }
  33. //////////////////////////////////////////////////////////////////////
  34. // CLockMRSW Construction/Destruction
  35. //////////////////////////////////////////////////////////////////////
  36. CLockMRSW::CLockMRSW()
  37. : m_eventIdle(::CreateEvent(NULL, TRUE, TRUE, NULL)), m_lUsing(-1L)
  38. {
  39. ::InitializeCriticalSection(&m_csModi);
  40. ::InitializeCriticalSection(&m_csExclusive);
  41. }
  42. CLockMRSW::~CLockMRSW()
  43. {
  44. ::DeleteCriticalSection(&m_csExclusive);
  45. ::DeleteCriticalSection(&m_csModi);
  46. ::CloseHandle(m_eventIdle);
  47. }
  48. void CLockMRSW::EnterRead()
  49. {
  50. ::EnterCriticalSection(&m_csExclusive);
  51. ::EnterCriticalSection(&m_csModi);
  52. if (++m_lUsing == 0)
  53. ::ResetEvent(m_eventIdle);
  54. ::LeaveCriticalSection(&m_csModi);
  55. ::LeaveCriticalSection(&m_csExclusive);
  56. }
  57. void CLockMRSW::LeaveRead()
  58. {
  59. ::EnterCriticalSection(&m_csModi);
  60. if (--m_lUsing < 0)
  61. ::SetEvent(m_eventIdle);
  62. ::LeaveCriticalSection(&m_csModi);
  63. }
  64. void CLockMRSW::EnterWrite()
  65. {
  66. ::EnterCriticalSection(&m_csExclusive);
  67. ::WaitForSingleObject(m_eventIdle, INFINITE);
  68. }
  69. void CLockMRSW::LeaveWrite()
  70. {
  71. ::LeaveCriticalSection(&m_csExclusive);
  72. }