#include #include #include #include #include #include //--------------------------------------------------------------------------- class Activity { public: virtual ~Activity(); virtual void Execute(); protected: virtual void PerformActivity(); private: void DoWork(); void SetStarted(); void SyncStart(); boost::recursive_mutex m_MutexState; boost::condition m_ConditionState; bool m_IsStarted; // must use mutex to access boost::shared_ptr m_ActivityThread; }; //--------------------------------------------------------------------------- Activity::~Activity() { } //--------------------------------------------------------------------------- void Activity::DoWork() { SetStarted(); // additional code removed for brevity } //--------------------------------------------------------------------------- // virtual void Activity::Execute() { boost::recursive_mutex::scoped_lock lock(m_MutexState); m_IsStarted = false; m_ActivityThread.reset(new boost::thread(boost::bind(&Activity::DoWork, this))); SyncStart(); } //--------------------------------------------------------------------------- void Activity::PerformActivity() { std::cout << "Hello world!"; } //--------------------------------------------------------------------------- void Activity::SetStarted() { // Thread 2 deadlocks here boost::recursive_mutex::scoped_lock lock(m_MutexState); m_IsStarted = true; m_ConditionState.notify_all(); } //--------------------------------------------------------------------------- void Activity::SyncStart() { boost::recursive_mutex::scoped_lock lock(m_MutexState); while (!m_IsStarted) { // Thread 1 deadlocks here m_ConditionState.wait(lock); } } //--------------------------------------------------------------------------- int main() { Activity activity; activity.Execute(); }