Имеет ли здесь значение порядок разблокировки мьютексов?

Допустим, у меня есть две переменные, 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);
}

Давным-давно в интервью мне задали вопрос относительно этой ситуации, и я пришел к выводу, что ответ был утвердительным — порядок этих двух разблокировок имеет значение. Я не могу понять, как из-за этого может возникнуть взаимоблокировка, если блокировки всегда получаются в одном и том же порядке, где бы они ни использовались.

9
задан John Humphreys - w00te 23 February 2012 в 14:20
поделиться