Во избежание тупика, вероятно, лучше всего подождать, пока оба ресурса не будут заблокированы:
Не знаю, какой API мьютекса вы используете, так что вот какой-то произвольный псевдокод, предположим, что can_lock()
только проверяет, может ли он заблокировать мьютекс, и что try_lock()
возвращает true, если он заблокирован, и false, если мьютекс уже заблокирован кем-то другим.
void foo::copy(const foo & rhs)
{
for(;;)
{
if(! pMutex->cany_lock() || ! rhs.pMutex->cany_lock())
{
// Depending on your environment call or dont call sleep()
continue;
}
if(! pMutex->try_lock())
continue;
if(! rhs.pMutex->try_lock())
{
pMutex->try_lock()
continue;
}
break;
}
// do copy
}