Mercurial > hg > qm-dsp
diff thread/AsynchronousTask.h @ 69:6afa0e011f74
* Fix some locking problems
author | cannam |
---|---|
date | Thu, 21 May 2009 16:39:35 +0000 |
parents | 09aba2ccd94a |
children | 701233f8ed41 |
line wrap: on
line diff
--- a/thread/AsynchronousTask.h Mon May 18 15:44:03 2009 +0000 +++ b/thread/AsynchronousTask.h Thu May 21 16:39:35 2009 +0000 @@ -12,6 +12,8 @@ #include "Thread.h" +#include <iostream> + /** * AsynchronousTask provides a thread pattern implementation for * threads which are used to perform a series of similar operations in @@ -46,8 +48,10 @@ } virtual ~AsynchronousTask() { + m_todo.lock(); m_finishing = true; m_todo.signal(); + m_todo.unlock(); wait(); } @@ -61,15 +65,14 @@ protected: void startTask() { + m_done.lock(); m_todo.lock(); m_inTask = true; m_todo.signal(); - m_done.lock(); m_todo.unlock(); } void awaitTask() { - m_done.lock(); - while (m_inTask) m_done.wait(); + m_done.wait(); m_done.unlock(); } @@ -78,20 +81,22 @@ private: virtual void run() { m_todo.lock(); - while (!m_finishing) { + while (1) { while (!m_inTask && !m_finishing) { m_todo.wait(); } if (m_finishing) { + m_done.lock(); m_inTask = false; m_done.signal(); + m_done.unlock(); break; } - if (m_inTask) { - performTask(); - m_inTask = false; - m_done.signal(); - } + performTask(); + m_done.lock(); + m_inTask = false; + m_done.signal(); + m_done.unlock(); } m_todo.unlock(); }