Digamos que tengo dos variables, protected_var1
y protected_var2
. Supongamos además que estas variables se actualizan a través de varios subprocesos, y son bastante independientes, ya que generalmente se trabaja en una u otra, pero no en ambas, por lo que ambas tienen su propia protección mutex para la eficiencia.¿El orden de desbloqueo de mutexes hace una diferencia aquí?
Suponiendo:
-Siempre bloqueo mutex con el fin (mutex1 continuación mutex2) en mi código en las regiones donde se requieren las dos cerraduras.
-ambos mutexes se utilizan en muchos otros lugares por ellos mismos (como simplemente bloquear mutex1, o simplemente bloquear mutex2).
¿El orden en el que desbloqueo los mutexes al final de una función usando ambos hace una diferencia en esta situación?
void foo()
{
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
int x = protected_var1 + protected_var2;
pthread_mutex_unlock(&mutex1); //Does the order of the next two lines matter?
pthread_mutex_unlock(&mutex2);
}
Me hicieron una pregunta hace mucho tiempo en una entrevista con respecto a esta situación, y salí sintiendo que la respuesta era sí - el orden de esas dos desbloqueos sí importa. No puedo, por la vida de mi entender, cómo podría resultar un punto muerto si los bloqueos se obtienen siempre en el mismo orden donde se usen ambos.
Muy ** muy ** punto importante. Sabía que había una razón para desbloquear pedidos. Por favor amplía esto un poco para que la gente lo vea. Considera desbloquear 'mutex1', hacer algo y luego agarrar' mutex1' de nuevo. Recuerdo haber tenido un punto muerto que se resolvió ordenando de forma inversa el lanzamiento del mutex y esa fue la causa. –
@ D.Shawley Eso ** causaría un punto muerto. (Me parece recordar analizar esto con más detalle en una respuesta reciente, a una pregunta sobre el uso de un mutex en un contenedor _y_ en los elementos individuales en el contenedor.) Pero eso viola la restricción de ordenamiento: si adquiere ambos mutexes, debe adquiere 'mutex1' primero. –