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

模拟服务器

开发平台:

C/C++

  1. // Lock.h: interface for the CLockXXXX class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_LOCK_H__F65AF80D_9748_4100_B0AC_823695855E5D__INCLUDED_)
  5. #define AFX_LOCK_H__F65AF80D_9748_4100_B0AC_823695855E5D__INCLUDED_
  6. class ALock
  7. {
  8. protected:
  9. ALock() {}
  10. virtual ~ALock() {}
  11. public:
  12. virtual void EnterRead() = 0;
  13. virtual void LeaveRead() = 0;
  14. virtual void EnterWrite() = 0;
  15. virtual void LeaveWrite() = 0;
  16. };
  17. //lock: single read & single write (critical section)
  18. //reading and writing is exclusive
  19. class CLockSRSW : public ALock
  20. {
  21. public:
  22. CLockSRSW();
  23. ~CLockSRSW();
  24. public:
  25. virtual void EnterRead();
  26. virtual void LeaveRead();
  27. virtual void EnterWrite();
  28. virtual void LeaveWrite();
  29. private:
  30. CRITICAL_SECTION m_csExclusive;
  31. };
  32. //lock: multi read & single write
  33. //reading is parallel, and writing is exclusive
  34. class CLockMRSW : public ALock
  35. {
  36. public:
  37. CLockMRSW();
  38. ~CLockMRSW();
  39. public:
  40. virtual void EnterRead();
  41. virtual void LeaveRead();
  42. virtual void EnterWrite();
  43. virtual void LeaveWrite();
  44. private:
  45. CRITICAL_SECTION m_csExclusive;
  46. CRITICAL_SECTION m_csModi;
  47. HANDLE m_eventIdle;
  48. LONG m_lUsing;
  49. };
  50. //assistant
  51. struct KAutoLockRead
  52. {
  53. ALock& theLock;
  54. KAutoLockRead(ALock& locksrc) : theLock(locksrc) {theLock.EnterRead();}
  55. ~KAutoLockRead() {theLock.LeaveRead();}
  56. };
  57. struct KAutoLockWrite
  58. {
  59. ALock& theLock;
  60. KAutoLockWrite(ALock& locksrc) : theLock(locksrc) {theLock.EnterWrite();}
  61. ~KAutoLockWrite() {theLock.LeaveWrite();}
  62. };
  63. //for more easy
  64. #define AUTOLOCKREAD(lock)
  65. KAutoLockRead __local_autolockread_(lock);
  66. #define AUTOLOCKREAD_(name, lock)
  67. KAutoLockRead name(lock);
  68. #define AUTOLOCKWRITE(lock)
  69. KAutoLockWrite __local_autolockwrite_(lock);
  70. #define AUTOLOCKWRITE_(name, lock)
  71. KAutoLockWrite name(lock);
  72. #endif // !defined(AFX_LOCK_H__F65AF80D_9748_4100_B0AC_823695855E5D__INCLUDED_)