|
cds
2.3.2
|
Treiber's stack algorithm. More...
#include <cds/container/treiber_stack.h>
Data Structures | |
| struct | rebind |
| Rebind template arguments. More... | |
Public Types | |
| typedef T | value_type |
| Value type stored in the stack. | |
| typedef base_class::gc | gc |
| Garbage collector used. | |
| typedef base_class::back_off | back_off |
| Back-off strategy used. | |
| typedef maker::allocator_type | allocator_type |
| Allocator type used for allocating/deallocating the nodes. | |
| typedef base_class::memory_model | memory_model |
| Memory ordering. See cds::opt::memory_order option. | |
| typedef base_class::stat | stat |
| Internal statistics policy used. | |
Public Types inherited from cds::intrusive::TreiberStack< GC, cds::intrusive::treiber_stack::node< T >, Traits > | |
| typedef GC | gc |
| Garbage collector. | |
| typedef cds::intrusive::treiber_stack::node< T > | value_type |
| type of value stored in the stack | |
| typedef Traits | traits |
| Stack 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::memory_model | memory_model |
Memory ordering. See cds::opt::memory_model option. | |
| typedef traits::item_counter | item_counter |
| Item counter class. | |
| typedef traits::stat | stat |
| Internal statistics. | |
| typedef traits::back_off | back_off |
| back-off strategy | |
| typedef traits::elimination_backoff | elimination_backoff_type |
| back-off strategy used to wait for elimination | |
| typedef traits::lock_type | elimination_lock_type |
| Lock type used in elimination back-off. | |
| typedef traits::random_engine | elimination_random_engine |
| Random engine used in elimination back-off. | |
Public Member Functions | |
| TreiberStack () | |
| Constructs empty stack. | |
| TreiberStack (size_t nCollisionCapacity) | |
| Constructs empty stack and initializes elimination back-off data. More... | |
| TreiberStack (TreiberStack const &)=delete | |
TreiberStack is not copy-constructible | |
| ~TreiberStack () | |
| Clears the stack on destruction. | |
| bool | push (value_type const &val) |
Pushes copy of val on the stack. | |
| template<typename... Args> | |
| bool | emplace (Args &&... args) |
Pushes data of type value_type created from std::forward<Args>(args)... | |
| bool | pop (value_type &val) |
| Pops an item from the stack. More... | |
| template<typename Func > | |
| bool | pop_with (Func f) |
| Pops an item from the stack with functor. More... | |
| bool | empty () const |
| Check if stack is empty. | |
| void | clear () |
| Clear the stack. | |
| size_t | size () const |
| Returns stack's item count. More... | |
| stat const & | statistics () const |
| Returns reference to internal statistics. | |
Public Member Functions inherited from cds::intrusive::TreiberStack< GC, cds::intrusive::treiber_stack::node< T >, Traits > | |
| TreiberStack () | |
| Constructs empty stack. | |
| TreiberStack (size_t nCollisionCapacity) | |
| Constructs empty stack and initializes elimination back-off data. More... | |
| TreiberStack (TreiberStack const &)=delete | |
TreiberStack is not copy-constructible | |
| ~TreiberStack () | |
| Destructor calls clear member function. | |
| bool | push (value_type &val) |
Push the item val on the stack. More... | |
| value_type * | pop () |
| Pop an item from the stack. More... | |
| bool | empty () const |
| Check if stack is empty. | |
| void | clear () |
| Clear the stack. More... | |
| size_t | size () const |
| Returns stack's item count. More... | |
| stat const & | statistics () const |
| Returns reference to internal statistics. | |
Protected Types | |
| typedef maker::node_type | node_type |
stack node type (derived from intrusive::treiber_stack::node) | |
Additional Inherited Members | |
Static Public Attributes inherited from cds::intrusive::TreiberStack< GC, cds::intrusive::treiber_stack::node< T >, Traits > | |
| static constexpr size_t const | c_nHazardPtrCount |
| How many Hazard pointers is required for Treiber's stack implementation. | |
| static constexpr const bool | enable_elimination |
| Elimination back-off is enabled or not. | |
Protected Attributes inherited from cds::intrusive::TreiberStack< GC, cds::intrusive::treiber_stack::node< T >, Traits > | |
| node_type::atomic_node_ptr | m_Top |
| Top of the stack. | |
| item_counter | m_ItemCounter |
| Item counter. | |
| stat | m_stat |
| Internal statistics. | |
Treiber's stack algorithm.
It is non-intrusive version of Treiber's stack algorithm based on intrusive implementation intrusive::TreiberStack.
Template arguments:
GC - garbage collector type: gc::HP, gc::DHPT - type stored in the stack.Traits - stack traits, default is treiber_stack::traits. You can use treiber_stack::make_traits metafunction to make your traits or just derive your traits from treiber_stack::traits:
|
inline |
Constructs empty stack and initializes elimination back-off data.
This form should be used if you use elimination back-off with dynamically allocated collision array, i.e Options... contains cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer >. nCollisionCapacity parameter specifies the capacity of collision array.
|
inline |
Pops an item from the stack.
The value of popped item is stored in val using assignment operator. On success functions returns true, val contains value popped from the stack. If stack is empty the function returns false, val is unchanged.
|
inline |
Pops an item from the stack with functor.
Func can be used to copy/move popped item from the stack. Func interface is:
where src - item popped.
|
inline |
Returns stack's item count.
The value returned depends on opt::item_counter option. For atomicity::empty_item_counter, this function always returns 0.
Warning: even if you use real item counter and it returns 0, this fact is not mean that the stack is empty. To check emptyness use empty() method.