Si un hilo ya tiene un bloqueo, entonces puede "tomar ese bloqueo" nuevamente sin problema.
En cuanto a qué es decir, (y eso que es una buena idea), considere la siguiente situación, donde tenemos un bloqueo definido ordenar otra parte del programa de a -> b:
void f()
{
lock(a)
{ /* do stuff inside a */ }
}
void doStuff()
{
lock(b)
{
//do stuff inside b, that involves leaving b in an inconsistent state
f();
//do more stuff inside b so that its consistent again
}
}
Vaya, acabamos de violar nuestro orden de bloqueo y tenemos un posible punto muerto en nuestras manos.
Nos realmente necesitamos ser capaces de hacer lo siguiente:
function doStuff()
{
lock(a)
lock(b)
{
//do stuff inside b, that involves leaving b in an inconsistent state
f();
//do more stuff inside b so that its consistent again
}
}
Así que nuestro pedido de bloqueo se mantiene, sin auto-interbloqueos cuando nos llaman f()
.
¿Por qué esperas que se produzca un punto muerto? (también, esto es bastante similar a http://stackoverflow.com/questions/391913/re-entrant-locks-in-c que puede ayudar) – AakashM
Esto es claramente un duplicado de eso, pero el título de esta pregunta es infinitamente mejor (para las personas que probablemente lo buscarían). –