ExclusiveHolder.tlh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //-----------------------------------------------------------------------------
  2. // 共享的模板类.
  3. // 不是 dll, 没有版本号, 因此要手工编写版本号
  4. // V1, 2013-09-03, 5.1.1 中发布, 使用 Synchronize.hpp
  5. // V2, 2018-03-02, 7.0 中发布, 改用 std::recursive_mutex 及 std::lock_guard
  6. // V3, 2020-09-30, 7.3 中发布, 删除 XDWHolder, 改用 std::unique_ptr. 同时修改了文件名
  7. //-----------------------------------------------------------------------------
  8. #pragma once
  9. #include <memory>
  10. #include <mutex>
  11. //-----------------------------------------------------------------------------
  12. // ExclusiveHolder.tlh
  13. // 允许互斥访问一个指针对象
  14. //-----------------------------------------------------------------------------
  15. template <typename T> class ExclusiveHolder
  16. {
  17. protected:
  18. T * m_pObject;
  19. public:
  20. ExclusiveHolder ();
  21. explicit ExclusiveHolder (T * object);
  22. virtual ~ExclusiveHolder ();
  23. private:
  24. // 禁止拷贝构造函数
  25. ExclusiveHolder (const ExclusiveHolder & h) = delete;
  26. // 禁止复制
  27. ExclusiveHolder & operator = (const ExclusiveHolder & h) = delete;
  28. public:
  29. void Attach (T * object);
  30. T * Detach ();
  31. ExclusiveHolder & operator = (T * object);
  32. bool IsEmpty () const;
  33. void Release ();
  34. protected:
  35. mutable std::recursive_mutex m_Mutex;
  36. public:
  37. class LockHolder
  38. {
  39. public:
  40. LockHolder (const ExclusiveHolder * holder);
  41. ~LockHolder ();
  42. LockHolder (LockHolder && from);
  43. private:
  44. // 可以对同一个 ExclusiveHolder 对象反复调用 Lock, 但是 LockHolder 还是不要拷贝构造了吧
  45. // 禁止拷贝构造函数
  46. LockHolder (const LockHolder & h) = delete;
  47. // 禁止复制
  48. LockHolder & operator = (const LockHolder & h) = delete;
  49. public:
  50. T * As ();
  51. const T * As () const;
  52. template <typename C> C * AS ();
  53. template <typename C> const C * AS () const;
  54. T * operator -> ()
  55. {
  56. return As ();
  57. }
  58. const T * operator -> () const
  59. {
  60. return As ();
  61. }
  62. T & operator * ()
  63. {
  64. return *As ();
  65. }
  66. const T & operator * () const
  67. {
  68. return *As ();
  69. }
  70. protected:
  71. std::unique_ptr <std::lock_guard < std::recursive_mutex > > m_Lock;
  72. const ExclusiveHolder * m_Holder;
  73. };
  74. public:
  75. inline LockHolder Lock ()
  76. {
  77. return LockHolder (this);
  78. }
  79. inline LockHolder Lock () const
  80. {
  81. return LockHolder (this);
  82. }
  83. template <class Action> void LockExec (Action action)
  84. {
  85. LockHolder holder (this);
  86. action (holder.As ());
  87. }
  88. template <class Action> void LockExec (Action action) const
  89. {
  90. LockHolder holder (this);
  91. action (holder.As ());
  92. }
  93. };