diff --git a/include/ParallelPriorityQueue/SpapQueue.hpp b/include/ParallelPriorityQueue/SpapQueue.hpp index e928a41..c64a941 100644 --- a/include/ParallelPriorityQueue/SpapQueue.hpp +++ b/include/ParallelPriorityQueue/SpapQueue.hpp @@ -67,7 +67,7 @@ namespace spapq { * @see QNetwork * @see WorkerResource */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> class SpapQueue final { template friend class WorkerTemplate; @@ -163,7 +163,7 @@ class SpapQueue final { * @brief Wait till the whole queue has finished processing all tasks. * */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> void SpapQueue::waitProcessFinish() { for (auto &thread : workers_) { if (thread.joinable()) { thread.join(); } @@ -181,7 +181,7 @@ void SpapQueue::waitProcessFinish() { * @return true If initialisation has succeeded, i.e., not already initialised. * @return false If the queue is already active. */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> template bool SpapQueue::initQueue(Args &&...workerArgs) { if (queueActive_.exchange(true, std::memory_order_acq_rel)) { @@ -203,13 +203,13 @@ bool SpapQueue::initQueue(Args &&...workerA * @brief Signals the workers to begin processing the queue. * */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> void SpapQueue::processQueue() { startSignal_.test_and_set(std::memory_order_release); startSignal_.notify_all(); } -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> template ::pushInternalHelper( * @brief Batch push onto channel, return whether succeeded. * */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> template inline bool SpapQueue::pushInternal(InputIt first, InputIt last, @@ -260,7 +260,7 @@ inline bool SpapQueue::pushInternal(InputIt * @param stoken Stop token * @param workerArgs Arguments to be passed to the worker constructor. */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> template void SpapQueue::threadWork(std::stop_token stoken, Args &&...workerArgs) { static_assert(N < netw.numWorkers_); @@ -348,7 +348,7 @@ void SpapQueue::threadWork(std::stop_token * @brief Request early stop or termination of the queue. * */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> void SpapQueue::requestStop() { if (not queueActive_.load(std::memory_order_acquire)) { return; } @@ -356,14 +356,14 @@ void SpapQueue::requestStop() { processQueue(); // In case worker threads are waiting for start signal } -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> SpapQueue::~SpapQueue() noexcept { queueActive_.store(true, std::memory_order_relaxed); // Such that nobody else can start the queue requestStop(); // Required because worker threads can be stuck awaiting start signal // Deconstructor of jthread automatically joins the worker threads and thus destroys the worker resources } -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> template ::pushBeforeProcessing * @param val Task or queue element. * @param workerId Worker id whose local queue to push to. */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> inline void SpapQueue::pushBeforeProcessing( const value_type val, const std::size_t workerId) noexcept { globalCount_.fetch_add(1U, std::memory_order_relaxed); @@ -409,7 +409,7 @@ inline void SpapQueue::pushBeforeProcessing * @return false If push failed. This is either because the channel buffer is full or the queue has already * finished. */ -template class WorkerTemplate, BasicQueue LocalQType> +template class WorkerTemplate, BasicQueue LocalQType> template inline bool SpapQueue::pushDuringProcessing(const value_type val) noexcept { static_assert(channel < netw.numChannels_, "Must be a valid channel in the QNetwork."); diff --git a/include/ParallelPriorityQueue/SpapQueueWorker.hpp b/include/ParallelPriorityQueue/SpapQueueWorker.hpp index 9200161..f408513 100644 --- a/include/ParallelPriorityQueue/SpapQueueWorker.hpp +++ b/include/ParallelPriorityQueue/SpapQueueWorker.hpp @@ -42,7 +42,7 @@ template class WorkerResource { template friend class WorkerResource; - template class, BasicQueue> + template class, BasicQueue> friend class SpapQueue; public: @@ -120,8 +120,8 @@ class WorkerResource { * @see SpapQueue * @see WorkerResource */ -template