Допустим, у меня есть две переменные, protected_var1
и protected_var2
. Давайте также предположим, что эти переменные обновляются через несколько потоков и достаточно независимы в том смысле, что обычно обрабатываются один или другой, но не оба, поэтому они обе имеют свою собственную защиту мьютекса для повышения эффективности.
Предполагая:
-Я всегда блокирую мьютексы по порядку (мьютекс1, затем мьютекс2) в моем коде в областях, где требуются обе блокировки.
-Оба мьютекса используются во многих других местах сами по себе (например, просто заблокировать мьютекс1 или просто заблокировать мьютекс2).
Имеет ли значение в этой ситуации порядок, в котором я разблокирую мьютексы в конце функции с использованием обоих?
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);
}
Давным-давно в интервью мне задали вопрос относительно этой ситуации, и я пришел к выводу, что ответ был утвердительным — порядок этих двух разблокировок имеет значение. Я не могу понять, как из-за этого может возникнуть взаимоблокировка, если блокировки всегда получаются в одном и том же порядке, где бы они ни использовались.