From 26ebf5b65088062e4f3290b89a973fa3ef3eee1a Mon Sep 17 00:00:00 2001 From: Silent Date: Tue, 8 Oct 2019 22:57:33 +0200 Subject: [PATCH] Improvements to WorkQueueThread - Do not use a lambda for std::thread as invoke constructor exists - Use simpler std::lock_guard wherever possible - Do not require T to be default constructible - Move T out of the queue instead of copying --- Source/Core/Common/WorkQueueThread.h | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Source/Core/Common/WorkQueueThread.h b/Source/Core/Common/WorkQueueThread.h index 426d8b493d..e5dfac8b49 100644 --- a/Source/Core/Common/WorkQueueThread.h +++ b/Source/Core/Common/WorkQueueThread.h @@ -27,14 +27,14 @@ public: Shutdown(); m_shutdown.Clear(); m_function = std::move(function); - m_thread = std::thread([this] { ThreadLoop(); }); + m_thread = std::thread(&WorkQueueThread::ThreadLoop, this); } template void EmplaceItem(Args&&... args) { { - std::unique_lock lg(m_lock); + std::lock_guard lg(m_lock); m_items.emplace(std::forward(args)...); } m_wakeup.Set(); @@ -59,14 +59,13 @@ private: while (true) { - T item; - { - std::unique_lock lg(m_lock); - if (m_items.empty()) - break; - item = m_items.front(); - m_items.pop(); - } + std::unique_lock lg(m_lock); + if (m_items.empty()) + break; + T item{std::move(m_items.front())}; + m_items.pop(); + lg.unlock(); + m_function(std::move(item)); }