Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2007-01-09 16:02:17


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;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk