ThreadPool::~ThreadPool(void)
{
- unique_lock<mutex> lock(m_Lock);
-
- /* wait for all pending tasks */
- while (m_Tasks.size() > 0)
- m_CV.wait(lock);
+ {
+ unique_lock<mutex> lock(m_Lock);
+
+ m_Tasks.clear();
- /* notify worker threads to exit */
- m_Alive = false;
- m_CV.notify_all();
+ /* notify worker threads to exit */
+ m_Alive = false;
+ m_CV.notify_all();
+ }
+
+ m_Threads.join_all();
}
void ThreadPool::EnqueueTask(Task task)
m_CV.notify_one();
}
+void ThreadPool::WaitForTasks(void)
+{
+ unique_lock<mutex> lock(m_Lock);
+
+ /* wait for all pending tasks */
+ while (m_Tasks.size() > 0)
+ m_CV.wait(lock);
+}
+
void ThreadPool::WorkerThreadProc(void)
{
while (true) {
unique_lock<mutex> lock(m_Lock);
while (m_Tasks.size() == 0) {
- m_CV.wait(lock);
-
if (!m_Alive)
return;
+
+ m_CV.wait(lock);
}
task = m_Tasks.front();