Flow
Documentation for the Flow C++ Library
Loading...
Searching...
No Matches
flow::WorkStealingQueue< T > Class Template Reference

#include <flow_work_stealing_queue.h>

Public Member Functions

 WorkStealingQueue ()=default
 Constructs a concurrent FIFO queue.
 WorkStealingQueue (const allocator_type &allocator)
 Constructs a concurrent FIFO queue.
 WorkStealingQueue (const WorkStealingQueue &)=delete
 WorkStealingQueue (WorkStealingQueue &&)=delete
WorkStealingQueueoperator= (const WorkStealingQueue &)=delete
WorkStealingQueueoperator= (WorkStealingQueue &&)=delete
bool empty () const
 Checks if the queue is empty. Value can be obsolete in concurrency code.
std::size_t size () const
 Returns the number of elements in the queue. Value can be obsolete in concurrency code.
void push (const T &value)
 Pushes a new element into the queue.
void push (T &&value)
 Pushes a new element into the queue.
template<typename... Args>
void emplace (Args &&... args)
 Constructs a new element in place at the end of the queue.
std::optional< T > tryFront () const
 Tries to get a copy of the first element without removing it.
std::optional< T > tryPop ()
 Tries to pop front and return the first element.
waitPop ()
 Waits until the queue is not empty, then pops and returns the first element.
std::optional< T > trySteal ()
 Tries to pop back and return the last element.

Private Types

using allocator_type = typename std::deque<T>::allocator_type

Private Attributes

std::mutex mux_
std::condition_variable blocked_
std::deque< T > queue_

Detailed Description

template<typename T>
class flow::WorkStealingQueue< T >

Definition at line 11 of file flow_work_stealing_queue.h.

Member Typedef Documentation

◆ allocator_type

template<typename T>
using flow::WorkStealingQueue< T >::allocator_type = typename std::deque<T>::allocator_type
private

Definition at line 12 of file flow_work_stealing_queue.h.

Constructor & Destructor Documentation

◆ WorkStealingQueue() [1/4]

template<typename T>
flow::WorkStealingQueue< T >::WorkStealingQueue ( )
default

Constructs a concurrent FIFO queue.

Referenced by operator=(), operator=(), WorkStealingQueue(), and WorkStealingQueue().

◆ WorkStealingQueue() [2/4]

template<typename T>
flow::WorkStealingQueue< T >::WorkStealingQueue ( const allocator_type & allocator)
inlineexplicit

Constructs a concurrent FIFO queue.

Definition at line 23 of file flow_work_stealing_queue.h.

References queue_.

◆ WorkStealingQueue() [3/4]

template<typename T>
flow::WorkStealingQueue< T >::WorkStealingQueue ( const WorkStealingQueue< T > & )
delete

References WorkStealingQueue().

◆ WorkStealingQueue() [4/4]

template<typename T>
flow::WorkStealingQueue< T >::WorkStealingQueue ( WorkStealingQueue< T > && )
delete

References WorkStealingQueue().

Member Function Documentation

◆ emplace()

template<typename T>
template<typename... Args>
void flow::WorkStealingQueue< T >::emplace ( Args &&... args)
inline

Constructs a new element in place at the end of the queue.

Definition at line 65 of file flow_work_stealing_queue.h.

65 {
66 {
68 queue_.emplace_back(std::forward<Args>(args)...);
69 }
70 blocked_.notify_one();
71 }
std::condition_variable blocked_

References blocked_, mux_, and queue_.

◆ empty()

template<typename T>
bool flow::WorkStealingQueue< T >::empty ( ) const
inline

Checks if the queue is empty. Value can be obsolete in concurrency code.

Returns
True if empty, false otherwise.

Definition at line 34 of file flow_work_stealing_queue.h.

34 {
36 return queue_.empty();
37 }

References mux_, and queue_.

◆ operator=() [1/2]

template<typename T>
WorkStealingQueue & flow::WorkStealingQueue< T >::operator= ( const WorkStealingQueue< T > & )
delete

References WorkStealingQueue().

◆ operator=() [2/2]

template<typename T>
WorkStealingQueue & flow::WorkStealingQueue< T >::operator= ( WorkStealingQueue< T > && )
delete

References WorkStealingQueue().

◆ push() [1/2]

template<typename T>
void flow::WorkStealingQueue< T >::push ( const T & value)
inline

Pushes a new element into the queue.

Definition at line 46 of file flow_work_stealing_queue.h.

46 {
47 {
49 queue_.push_back(value);
50 }
51 blocked_.notify_one();
52 }

References blocked_, mux_, and queue_.

◆ push() [2/2]

template<typename T>
void flow::WorkStealingQueue< T >::push ( T && value)
inline

Pushes a new element into the queue.

Definition at line 55 of file flow_work_stealing_queue.h.

55 {
56 {
58 queue_.push_back(std::move(value));
59 }
60 blocked_.notify_one();
61 }

References blocked_, mux_, and queue_.

◆ size()

template<typename T>
std::size_t flow::WorkStealingQueue< T >::size ( ) const
inline

Returns the number of elements in the queue. Value can be obsolete in concurrency code.

Definition at line 40 of file flow_work_stealing_queue.h.

40 {
42 return queue_.size();
43 }

References mux_, and queue_.

◆ tryFront()

template<typename T>
std::optional< T > flow::WorkStealingQueue< T >::tryFront ( ) const
inline

Tries to get a copy of the first element without removing it.

Returns
A copy of the first element or std::nullopt if empty.

Definition at line 75 of file flow_work_stealing_queue.h.

75 {
77 if (queue_.empty()) {
78 return std::nullopt;
79 }
80 return queue_.front();
81 }

References mux_, and queue_.

◆ tryPop()

template<typename T>
std::optional< T > flow::WorkStealingQueue< T >::tryPop ( )
inline

Tries to pop front and return the first element.

Returns
The first element moved or std::nullopt if empty.

Definition at line 85 of file flow_work_stealing_queue.h.

85 {
87 if (queue_.empty()) {
88 return std::nullopt;
89 }
91
92 queue_.pop_front();
93 return value;
94 }

References mux_, and queue_.

◆ trySteal()

template<typename T>
std::optional< T > flow::WorkStealingQueue< T >::trySteal ( )
inline

Tries to pop back and return the last element.

Returns
The last element moved or std::nullopt if empty.

Definition at line 109 of file flow_work_stealing_queue.h.

109 {
111 if (queue_.empty()) {
112 return std::nullopt;
113 }
115
116 queue_.pop_back();
117 return value;
118 }

References mux_, and queue_.

◆ waitPop()

template<typename T>
T flow::WorkStealingQueue< T >::waitPop ( )
inline

Waits until the queue is not empty, then pops and returns the first element.

Returns
The first element.

Definition at line 98 of file flow_work_stealing_queue.h.

98 {
100 blocked_.wait(lock, [&]() { return !queue_.empty(); });
101
102 T value = std::move(queue_.front());
103 queue_.pop_front();
104 return value;
105 }

References blocked_, mux_, and queue_.

Member Data Documentation

◆ blocked_

template<typename T>
std::condition_variable flow::WorkStealingQueue< T >::blocked_
private

Definition at line 15 of file flow_work_stealing_queue.h.

Referenced by emplace(), push(), push(), and waitPop().

◆ mux_

template<typename T>
std::mutex flow::WorkStealingQueue< T >::mux_
mutableprivate

Definition at line 14 of file flow_work_stealing_queue.h.

Referenced by emplace(), empty(), push(), push(), size(), tryFront(), tryPop(), trySteal(), and waitPop().

◆ queue_

template<typename T>
std::deque<T> flow::WorkStealingQueue< T >::queue_
private

The documentation for this class was generated from the following file: