2#include <condition_variable>
35 std::lock_guard lock(
mux_);
41 std::lock_guard lock(
mux_);
46 void push(
const T& value) {
48 std::lock_guard lock(
mux_);
57 std::lock_guard lock(
mux_);
58 queue_.push_back(std::move(value));
64 template <
typename... Args>
67 std::lock_guard lock(
mux_);
68 queue_.emplace_back(std::forward<Args>(args)...);
76 std::lock_guard lock(
mux_);
86 std::lock_guard lock(
mux_);
90 std::optional<T> value = std::move(
queue_.front());
99 std::unique_lock lock(
mux_);
102 T value = std::move(
queue_.front());
110 std::lock_guard lock(
mux_);
114 std::optional<T> value = std::move(
queue_.back());
void push(const T &value)
Pushes a new element into the queue.
void emplace(Args &&... args)
Constructs a new element in place at the end of the queue.
WorkStealingQueue(const WorkStealingQueue &)=delete
std::size_t size() const
Returns the number of elements in the queue. Value can be obsolete in concurrency code.
T waitPop()
Waits until the queue is not empty, then pops and returns the first element.
WorkStealingQueue & operator=(const WorkStealingQueue &)=delete
WorkStealingQueue(WorkStealingQueue &&)=delete
typename std::deque< T >::allocator_type allocator_type
WorkStealingQueue()=default
Constructs a concurrent FIFO queue.
std::optional< T > tryPop()
Tries to pop front and return the first element.
WorkStealingQueue(const allocator_type &allocator)
Constructs a concurrent FIFO queue.
bool empty() const
Checks if the queue is empty. Value can be obsolete in concurrency code.
void push(T &&value)
Pushes a new element into the queue.
std::condition_variable blocked_
std::optional< T > tryFront() const
Tries to get a copy of the first element without removing it.
std::optional< T > trySteal()
Tries to pop back and return the last element.
WorkStealingQueue & operator=(WorkStealingQueue &&)=delete