diff --git a/src/core/thread.cpp b/src/core/thread.cpp index e498db38..698fb5ee 100644 --- a/src/core/thread.cpp +++ b/src/core/thread.cpp @@ -47,7 +47,7 @@ private: }; Thread::Thread() -: m_isTerminatedMutexLock(m_isTerminatedMutex), m_userReqTerminateLock(m_shouldTerminateMutex) +: m_userReqTerminateLock(m_shouldTerminateMutex), m_threadStartBarrier(2) { } @@ -62,7 +62,10 @@ Thread::Run() boost::mutex::scoped_lock threadLock(m_threadObjMutex); if (!m_threadObj.get()) + { m_threadObj.reset(new boost::thread(ThreadStarter(*this))); + m_threadStartBarrier.wait(); + } } void @@ -114,10 +117,9 @@ Thread::Msleep(unsigned msecs) void Thread::MainWrapper() { + boost::timed_mutex::scoped_lock lock(m_isTerminatedMutex); + m_threadStartBarrier.wait(); this->Main(); - // Thread has been terminated. - // Unlock the isTerminated mutex. - m_isTerminatedMutexLock.unlock(); } bool diff --git a/src/core/thread.h b/src/core/thread.h index a2d2473c..3e808085 100644 --- a/src/core/thread.h +++ b/src/core/thread.h @@ -22,6 +22,7 @@ #define _THREAD_H_ #include +#include #include #ifndef NANOSECONDS_PER_SECOND @@ -68,7 +69,6 @@ private: // Flag specifying whether the application code within the // thread was terminated. mutable boost::timed_mutex m_isTerminatedMutex; - mutable boost::timed_mutex::scoped_try_lock m_isTerminatedMutexLock; // Flag specifying whether the thread should be terminated. mutable boost::timed_mutex m_shouldTerminateMutex; @@ -78,6 +78,8 @@ private: boost::shared_ptr m_threadObj; mutable boost::mutex m_threadObjMutex; + boost::barrier m_threadStartBarrier; + friend class ThreadStarter; };