You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ConcurrentQueue.hpp 1.5 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #pragma once
  2. #ifndef CONCURRENT_QUEUE_HPP
  3. #define CONCURRENT_QUEUE_HPP
  4. #include <queue>
  5. #include <mutex>
  6. #include <utility>
  7. #include <optional>
  8. template<typename Elem>
  9. class ConcurrentQueue
  10. {
  11. private:
  12. using queueType = std::queue<Elem>;
  13. public:
  14. using sizeType = typename queueType::size_type;
  15. using valueType = typename queueType::value_type;
  16. using reference = typename queueType::reference;
  17. using constReference = typename queueType::const_reference;
  18. using containerType = typename queueType::container_type;
  19. ConcurrentQueue() = default;
  20. ConcurrentQueue(const ConcurrentQueue&) = delete;
  21. ~ConcurrentQueue() noexcept = default;
  22. ConcurrentQueue& operator=(const ConcurrentQueue&) = delete;
  23. void clear()
  24. {
  25. std::scoped_lock<std::mutex> lock(mtx);
  26. while (!q.empty())
  27. q.pop();
  28. }
  29. [[nodiscard]] bool empty() const
  30. {
  31. std::scoped_lock<std::mutex> lock(mtx);
  32. return q.empty();
  33. }
  34. template<typename... Ts>
  35. void emplace(Ts&&... args)
  36. {
  37. std::scoped_lock<std::mutex> lock(mtx);
  38. q.emplace(std::forward<Ts>(args)...);
  39. }
  40. [[nodiscard]] std::optional<valueType> tryPop()
  41. {
  42. std::scoped_lock<std::mutex> lock(mtx);
  43. if (q.empty())
  44. return std::nullopt;
  45. auto out = std::make_optional<valueType>(std::move(q.front()));
  46. q.pop();
  47. return out;
  48. }
  49. private:
  50. mutable std::mutex mtx;
  51. queueType q;
  52. };
  53. #endif