0
0
mirror of https://github.com/yse/easy_profiler.git synced 2024-12-26 08:01:51 +08:00

#0 [Gui] Thread pool fix: there was a possibility that not all tasks would be executed

This commit is contained in:
Victor Zarubkin 2018-02-25 21:19:23 +03:00
parent b6b988e274
commit b07de42a48

View File

@ -115,15 +115,23 @@ void ThreadPool::work()
if (m_interrupt.load(std::memory_order_acquire))
break;
if (m_tasks.empty())
continue;
while (true) // execute all available tasks
{
if (m_tasks.empty())
break; // the lock will be released on the outer loop new iteration
auto& task = m_tasks.front().get();
task.setStatus(TaskStatus::Processing);
m_tasks.pop_front();
auto& task = m_tasks.front().get();
task.setStatus(TaskStatus::Processing);
m_tasks.pop_front();
lock.unlock();
// unlock to permit tasks execution for other worker threads
lock.unlock();
task.execute();
// execute task
task.execute();
// lock again to check if there are new tasks in the queue
lock.lock();
}
}
}