Fixed a bug in the thread implementation. A lock cannot be used within two different threads.
This commit is contained in:
+6
-4
@@ -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
|
||||
|
||||
+3
-1
@@ -22,6 +22,7 @@
|
||||
#define _THREAD_H_
|
||||
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/thread/barrier.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#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<boost::thread> m_threadObj;
|
||||
mutable boost::mutex m_threadObjMutex;
|
||||
|
||||
boost::barrier m_threadStartBarrier;
|
||||
|
||||
friend class ThreadStarter;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user