El siguiente código contiene un punto muerto potencial, pero parece ser necesario: para copiar datos a un contenedor de otro, ambos contenedores deben estar bloqueados para evitar que ocurran cambios en otro hilo.Adquirir un bloqueo en dos mutexes y evitar el interbloqueo
void foo::copy(const foo & rhs)
{
pMutex->lock();
rhs.pMutex->lock();
// do copy
}
Foo tiene un contenedor STL y "do copy" consiste esencialmente en usar std :: copy. ¿Cómo bloqueo ambos mutexes sin introducir un punto muerto?
Incluso algo tan simple como las direcciones de este vs RHS trabajaría. siempre bloquee primero el que tiene la dirección más baja. –
clon solo funcionaría bien si no estuviera copiando, y no creo que el uso compartido implícito funcione, pero voy a echar un vistazo. Interesante enfoque Kyle. No puedo ver ningún defecto. – pomeroy