1. Choose the lock order by address
The simplest technique in these cases is to always lock the mutexes in ascending order of address:
void lock(boost::mutex& m1,boost::mutex& m2)
{
if(&m1<&m2)
{
m1.lock();
m2.lock();
}
else
{
m2.lock();
m1.lock();
}
}
2. Order mutexes "naturally", with try-and-back-off
If the mutexes cannot be ordered by address (for whatever reason), then an alternative scheme must be found. One such scheme is to use a try-and-back-off algorithm: try and lock each mutex in turn; if any cannot be locked, unlock the others and start again. The simplest implementation for 3 mutexes looks like this:void lock(boost::mutex& m1,boost::mutex& m2,boost::mutex& m3)
{
do
{
m1.lock();
if(m2.try_lock())
{
if(m3.try_lock())
{
return;
}
m2.unlock();
}
m1.unlock();
}
while(true);
}

No comments:
Post a Comment