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
This commit is contained in:
Silent 2019-10-08 22:57:33 +02:00
parent 19ed64122c
commit 26ebf5b650
No known key found for this signature in database
GPG Key ID: AE53149BB0C45AF1

View File

@ -27,14 +27,14 @@ public:
Shutdown(); Shutdown();
m_shutdown.Clear(); m_shutdown.Clear();
m_function = std::move(function); m_function = std::move(function);
m_thread = std::thread([this] { ThreadLoop(); }); m_thread = std::thread(&WorkQueueThread::ThreadLoop, this);
} }
template <typename... Args> template <typename... Args>
void EmplaceItem(Args&&... args) void EmplaceItem(Args&&... args)
{ {
{ {
std::unique_lock<std::mutex> lg(m_lock); std::lock_guard lg(m_lock);
m_items.emplace(std::forward<Args>(args)...); m_items.emplace(std::forward<Args>(args)...);
} }
m_wakeup.Set(); m_wakeup.Set();
@ -59,14 +59,13 @@ private:
while (true) while (true)
{ {
T item; std::unique_lock lg(m_lock);
{ if (m_items.empty())
std::unique_lock<std::mutex> lg(m_lock); break;
if (m_items.empty()) T item{std::move(m_items.front())};
break; m_items.pop();
item = m_items.front(); lg.unlock();
m_items.pop();
}
m_function(std::move(item)); m_function(std::move(item));
} }