cds
2.3.2
|
Michael & Scott's intrusive lock-free queue. More...
#include <cds/intrusive/msqueue.h>
Data Structures | |
struct | rebind |
Rebind template arguments. More... | |
Public Types | |
typedef GC | gc |
Garbage collector. | |
typedef T | value_type |
type of value to be stored in the queue | |
typedef Traits | traits |
Queue traits. | |
typedef traits::hook | hook |
hook type | |
typedef hook::node_type | node_type |
node type | |
typedef traits::disposer | disposer |
disposer used | |
typedef get_node_traits< value_type, node_type, hook >::type | node_traits |
node traits | |
typedef single_link::get_link_checker< node_type, traits::link_checker >::type | link_checker |
link checker | |
typedef traits::back_off | back_off |
back-off strategy | |
typedef traits::item_counter | item_counter |
Item counter class. | |
typedef traits::stat | stat |
Internal statistics. | |
typedef traits::memory_model | memory_model |
Memory ordering. See cds::opt::memory_model option. | |
Public Member Functions | |
MSQueue () | |
Initializes empty queue. | |
~MSQueue () | |
Destructor clears the queue. More... | |
bool | enqueue (value_type &val) |
Enqueues val value into the queue. More... | |
value_type * | dequeue () |
Dequeues a value from the queue. More... | |
bool | push (value_type &val) |
Synonym for enqueue() function. | |
value_type * | pop () |
Synonym for dequeue() function. | |
bool | empty () const |
Checks if the queue is empty. | |
void | clear () |
Clear the queue. More... | |
size_t | size () const |
Returns queue's item count. More... | |
stat const & | statistics () const |
Returns reference to internal statistics. | |
Static Public Attributes | |
static constexpr const size_t | c_nHazardPtrCount = 2 |
Count of hazard pointer required for the algorithm. | |
Michael & Scott's intrusive lock-free queue.
Implementation of well-known Michael & Scott's queue algorithm:
Template arguments:
GC
- garbage collector type: gc::HP
, gc::DHP
T
- type of value to be stored in the queue. A value of type T
must be derived from msqueue::node
for msqueue::base_hook
, or it should have a member of type msqueue::node
for msqueue::member_hook
, or it should be convertible to msqueue::node
for msqueue::traits_hook
.Traits
- queue traits, default is msqueue::traits
. You can use msqueue::make_traits
metafunction to make your traits or just derive your traits from msqueue::traits
: dequeue()
function for explanation.
|
inline |
Destructor clears the queue.
Since the Michael & Scott queue contains at least one item even if the queue is empty, the destructor may call item disposer.
|
inline |
Clear the queue.
The function repeatedly calls dequeue()
until it returns nullptr
. The disposer defined in template Traits
is called for each item that can be safely disposed.
|
inline |
Dequeues a value from the queue.
If the queue is empty the function returns nullptr
.
dequeue
() is called, the item returning is still queue's top, and previous top is disposed:dequeue
() function returns Item 2, that becomes new top of queue, and calls the disposer for Item 1, that was queue's top on function entry. Thus, you cannot manually delete item returned because it is still included in item sequence and it has valuable link field that must not be zeroed. The item should be deleted only in garbage collector retire cycle using the disposer.
|
inline |
|
inline |
Returns queue's item count.
The value returned depends on msqueue::traits::item_counter
. For atomicity::empty_item_counter
, this function always returns 0.
empty()
method.