From 3710ce88088c00599c5b108456f6dde9a4d981bc Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期三, 08 七月 2020 18:09:58 +0800 Subject: [PATCH] commmit --- squeue/include/array_lock_free_queue.h | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-) diff --git a/squeue/include/array_lock_free_queue.h b/squeue/include/array_lock_free_queue.h index 89f7f45..e03d6cd 100644 --- a/squeue/include/array_lock_free_queue.h +++ b/squeue/include/array_lock_free_queue.h @@ -1,9 +1,9 @@ -#ifndef __LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ -#define __LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ +#ifndef __ARRAY_LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ +#define __ARRAY_LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ #include <assert.h> // assert() #include <sched.h> // sched_yield() - +#include "logger_factory.h" /// @brief implementation of an array based lock free queue with support for /// multiple producers @@ -39,6 +39,8 @@ /// @brief calculate the index in the circular array that corresponds /// to a particular "count" value inline uint32_t countToIndex(uint32_t a_count); + + ELEM_T& operator[](unsigned i); private: size_t Q_SIZE; @@ -304,4 +306,18 @@ return false; } + +template <typename ELEM_T> +ELEM_T& ArrayLockFreeQueue<ELEM_T>::operator[](unsigned int i) +{ + int currentCount = m_count.load(); + uint32_t currentReadIndex = m_readIndex.load(); + if (i < 0 || i >= currentCount) + { + std::cerr << "Error in array limits: " << i << " is out of range\n"; + std::exit(EXIT_FAILURE); + } + return m_theQueue[countToIndex(currentReadIndex+i)]; +} + #endif // __LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ -- Gitblit v1.8.0