BlockingQueue.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * BlockingQueue.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "StdInc.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. //Credit to https://github.com/Liam0205/toy-threadpool/tree/master/yuuki
  14. template <typename T>
  15. class DLL_LINKAGE BlockingQueue : protected std::queue<T>
  16. {
  17. using WriteLock = std::unique_lock<std::shared_mutex>;
  18. using Readlock = std::shared_lock<std::shared_mutex>;
  19. public:
  20. BlockingQueue() = default;
  21. ~BlockingQueue()
  22. {
  23. clear();
  24. }
  25. BlockingQueue(const BlockingQueue&) = delete;
  26. BlockingQueue(BlockingQueue&&) = delete;
  27. BlockingQueue& operator=(const BlockingQueue&) = delete;
  28. BlockingQueue& operator=(BlockingQueue&&) = delete;
  29. public:
  30. bool empty() const
  31. {
  32. Readlock lock(mx);
  33. return std::queue<T>::empty();
  34. }
  35. size_t size() const
  36. {
  37. Readlock lock(mx);
  38. return std::queue<T>::size();
  39. }
  40. public:
  41. void clear()
  42. {
  43. WriteLock lock(mx);
  44. while (!std::queue<T>::empty())
  45. {
  46. std::queue<T>::pop();
  47. }
  48. }
  49. void push(const T& obj)
  50. {
  51. WriteLock lock(mx);
  52. std::queue<T>::push(obj);
  53. }
  54. template <typename... Args>
  55. void emplace(Args&&... args)
  56. {
  57. WriteLock lock(mx);
  58. std::queue<T>::emplace(std::forward<Args>(args)...);
  59. }
  60. bool pop(T& holder)
  61. {
  62. WriteLock lock(mx);
  63. if (std::queue<T>::empty())
  64. {
  65. return false;
  66. }
  67. else
  68. {
  69. holder = std::move(std::queue<T>::front());
  70. std::queue<T>::pop();
  71. return true;
  72. }
  73. }
  74. private:
  75. mutable std::shared_mutex mx;
  76. };
  77. VCMI_LIB_NAMESPACE_END