6#ifndef OPENCBDC_TX_SRC_COMMON_BLOCKING_QUEUE_H_
7#define OPENCBDC_TX_SRC_COMMON_BLOCKING_QUEUE_H_
9#include <condition_variable>
18 template<
typename T,
typename Q>
41 auto push(
const T& item) ->
size_t {
43 std::unique_lock<std::mutex> lck(m_mut);
46 return m_buffer.size();
59 [[nodiscard]]
auto pop(T& item) ->
bool {
61 std::unique_lock<std::mutex> lck(m_mut);
62 if(m_buffer.empty()) {
69 if(!m_buffer.empty()) {
70 item = std::move(first_item<T, Q>());
73 m_wake = !m_buffer.empty();
83 std::unique_lock<std::mutex> lck(m_mut);
84 m_buffer =
decltype(m_buffer)();
94 std::unique_lock l(m_mut);
99 template<
typename TT,
typename QQ>
101 typename std::enable_if<std::is_same<QQ, std::queue<TT>>::value,
103 return m_buffer.front();
106 template<
typename TT,
typename QQ>
108 typename std::enable_if<!std::is_same<QQ, std::queue<TT>>::value,
110 return m_buffer.top();
115 std::condition_variable m_cv;
122 template<
typename T,
typename C = std::less<T>>
125 std::priority_queue<T, std::vector<T>, C>>;
Thread-safe producer-consumer FIFO queue supporting multiple concurrent producers and consumers.
~blocking_queue_internal()
Destructor.
auto push(const T &item) -> size_t
Pushes an element onto the queue and notifies at most one waiting consumer.
void clear()
Clears the queue and unblocks waiting consumers.
blocking_queue_internal()=default
blocking_queue_internal(blocking_queue_internal &&)=delete
auto operator=(const blocking_queue_internal &) -> blocking_queue_internal &=delete
auto operator=(blocking_queue_internal &&) -> blocking_queue_internal &=delete
void reset()
Removes the wakeup flag for consumers.
auto pop(T &item) -> bool
Pops an element from the queue.
blocking_queue_internal(const blocking_queue_internal &)=delete