
Steven Watanabe wrote:
AMDG
Andrey Semashev wrote:
Right, thanks for finding this. I'll try to fix it. I guess, I'll have to create a global mutex object for the assignment operations and lock it prior to other two locks and assignment. I think that this works: locking_state_machine& operator= (locking_state_machine const& that) { if(boost::addressof(that) != this) { const bool lock_this_first = boost::addressof(m_Mutex) < boost::addressof(that.m_Mutex); scoped_lock that_lock(lock_this_first? m_Mutex : that.m_Mutex); scoped_lock this_lock(lock_this_first? that.m_Mutex : m_Mutex); base_type::operator= (static_cast< base_type const& >(that)); } return *this; }
You should also consider not extending the critical sections beyond the minimum necessary, as in locking_state_machine& operator= (locking_state_machine const& that) { scoped_lock that_lock( that.m_Mutex ); base_type tmp( that ); that_lock.unlock(); scoped_lock this_lock( m_Mutex ); tmp.swap( *this ); this_lock.unlock(); return *this; }