XDWExclusiveHolder.tlh 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //-----------------------------------------------------------------------------
  2. // XDWExclusiveHolder.tlh
  3. // 允许互斥访问一个指针对象
  4. //-----------------------------------------------------------------------------
  5. #pragma once
  6. #include <mutex>
  7. #include "XDWHolder.tlh"
  8. #include "XDWHolder.tli"
  9. template <typename T> class XDWExclusiveHolder
  10. {
  11. typedef T __BASE;
  12. protected:
  13. T * m_pObject;
  14. public:
  15. XDWExclusiveHolder ();
  16. explicit XDWExclusiveHolder (T * object);
  17. virtual ~XDWExclusiveHolder ();
  18. private:
  19. // 禁止拷贝构造函数
  20. XDWExclusiveHolder (const XDWExclusiveHolder & h) = delete;
  21. // 禁止复制
  22. XDWExclusiveHolder & operator = (const XDWExclusiveHolder & h) = delete;
  23. public:
  24. void Attach (T * object);
  25. T * Detach ();
  26. XDWExclusiveHolder & operator = (T * object);
  27. // operator bool () const;
  28. bool IsEmpty () const;
  29. void Release ();
  30. protected:
  31. mutable std::recursive_mutex m_Mutex;
  32. public:
  33. class LockHolder
  34. {
  35. public:
  36. LockHolder (const XDWExclusiveHolder * holder);
  37. LockHolder (const LockHolder & h);
  38. ~LockHolder ();
  39. // void Unlock ();
  40. // bool IsLocked () const { return m_Lock->IsLocked (); }
  41. T * As ();
  42. const T * As () const;
  43. template <typename C> C * AS ();
  44. template <typename C> const C * AS () const;
  45. T * operator -> ()
  46. {
  47. return As ();
  48. }
  49. const T * operator -> () const
  50. {
  51. return As ();
  52. }
  53. private:
  54. // 禁止复制操作
  55. LockHolder & operator = (const LockHolder & h) = delete;
  56. protected:
  57. XDWHolder <std::lock_guard < std::recursive_mutex > > m_Lock;
  58. const XDWExclusiveHolder * m_Holder;
  59. };
  60. public:
  61. inline LockHolder Lock ()
  62. {
  63. return LockHolder (this);
  64. }
  65. inline LockHolder Lock () const
  66. {
  67. return LockHolder (this);
  68. }
  69. template <class Action> void LockExec (Action action)
  70. {
  71. LockHolder holder (this);
  72. action (holder.As ());
  73. }
  74. template <class Action> void LockExec (Action action) const
  75. {
  76. LockHolder holder (this);
  77. action (holder.As ());
  78. }
  79. };