| | |
| | | |
| | | |
| | | |
| | | template <typename T> |
| | | template <typename ELEM_T> |
| | | class LinkedLockFreeQueue |
| | | { |
| | | |
| | | template < |
| | | typename ELEM_T_, |
| | | template <typename T> class Q_TYPE > |
| | | friend class LockFreeQueue; |
| | | private: |
| | | // class scope definitions |
| | | enum {Q_SIZE = 10}; |
| | | |
| | | |
| | | // private class members |
| | | std::atomic<Pointer<T> > Head; // pointer to front of Queue |
| | | std::atomic<Pointer<T> > Tail; // pointer to rear of Queue |
| | | std::atomic<Pointer<ELEM_T> > Head; // pointer to front of Queue |
| | | std::atomic<Pointer<ELEM_T> > Tail; // pointer to rear of Queue |
| | | //std::atomic_uint count; // current number of size in Queue |
| | | std::atomic_uint count; |
| | | const size_t qsize; // maximum number of size in Queue |
| | |
| | | bool empty() const; |
| | | bool full() const; |
| | | unsigned int size() const; |
| | | bool push(const T &item); // add item to end |
| | | bool pop(T &item); |
| | | bool push(const ELEM_T &item); // add item to end |
| | | bool pop(ELEM_T &item); |
| | | |
| | | |
| | | T& operator[](unsigned i); |
| | | ELEM_T& operator[](unsigned i); |
| | | |
| | | }; |
| | | |
| | | |
| | | |
| | | |
| | | // Queue methods |
| | |
| | | Head.store(pointer, std::memory_order_relaxed); |
| | | Tail.store(pointer, std::memory_order_relaxed); |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | template <typename T> |
| | | LinkedLockFreeQueue<T>::~LinkedLockFreeQueue() |
| | | { |
| | | std::cerr << "LinkedLockFreeQueue destory" << std::endl; |
| | | |
| | | Node<T> * nodeptr; |
| | | Pointer<T> tmp = Head.load(std::memory_order_relaxed); |
| | | while((nodeptr = tmp.ptr) != NULL) { |
| | |
| | | delete nodeptr; |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | template <typename T> |