template<typename T, size_t LogSize = TF_DEFAULT_BOUNDED_TASK_QUEUE_LOG_SIZE>
tf::BoundedTaskQueue class

class to create a lock-free bounded single-producer multiple-consumer queue

Template parameters
T data type
LogSize the base-2 logarithm of the queue size

This class implements the work-stealing queue described in the paper, "Correct and Efficient Work-Stealing for Weak Memory Models," available at https://www.di.ens.fr/~zappa/readings/ppopp13.pdf.

Only the queue owner can perform pop and push operations, while others can steal data from the queue.

Constructors, destructors, conversion operators

BoundedTaskQueue() defaulted
constructs the queue with a given capacity
~BoundedTaskQueue() defaulted
destructs the queue

Public functions

auto empty() const -> bool noexcept
queries if the queue is empty at the time of this call
auto size() const -> size_t noexcept
queries the number of items at the time of this call
auto capacity() const -> size_t constexpr
queries the capacity of the queue
template<typename O>
auto try_push(O&& item) -> bool
tries to insert an item to the queue
template<typename O, typename C>
void push(O&& item, C&& on_full)
tries to insert an item to the queue or invoke the callable if fails
auto pop() -> T
pops out an item from the queue
auto steal() -> T
steals an item from the queue

Function documentation

template<typename T, size_t LogSize> template<typename O>
bool tf::BoundedTaskQueue<T, LogSize>::try_push(O&& item)

tries to insert an item to the queue

Template parameters
O data type
Parameters
item the item to perfect-forward to the queue
Returns true if the insertion succeed or false (queue is full)

Only the owner thread can insert an item to the queue.

template<typename T, size_t LogSize> template<typename O, typename C>
void tf::BoundedTaskQueue<T, LogSize>::push(O&& item, C&& on_full)

tries to insert an item to the queue or invoke the callable if fails

Template parameters
O data type
C callable type
Parameters
item the item to perfect-forward to the queue
on_full callable to invoke when the queue is faull (insertion fails)

Only the owner thread can insert an item to the queue.

template<typename T, size_t LogSize>
T tf::BoundedTaskQueue<T, LogSize>::pop()

pops out an item from the queue

Only the owner thread can pop out an item from the queue. The return can be a std::nullopt if this operation failed (empty queue).

template<typename T, size_t LogSize>
T tf::BoundedTaskQueue<T, LogSize>::steal()

steals an item from the queue

Any threads can try to steal an item from the queue. The return can be a std::nullopt if this operation failed (not necessary empty).