Двойная блокировка переключатель
От: igor-booch Россия  
Дата: 16.09.15 13:28
Оценка:
Блокировка эксклюзивно блокирует два ресурса.
Но не два одновременно, а напротив не допускает одновременного захвата обоих ресурсов.
Захвачен может быть только один ресурс, либо оба ресурса должны быть свободны.
Освобождение захваченного ресурса, происходит при захвате свободного ресурса.

Например, блокировка работает с 2-ми ресурсами A и B.

Предположим захвачен ресурс B
При захвате А, освобождается B
При освобождении А, B не захватывается, оба ресурса становятся свободными

И наоборот
Предположим захвачен ресурс A
При захвате B, освобождается A
При освобождении B, A не захватывается, оба ресурса становятся свободными

Не обязательно чтобы работало наоборот, мне достаточно чтобы работало только в прямом направлении (то есть ресурсы асимметричны), но если будет работать и наоборот (то есть ресурсы симметричны), то это не помешает.

Если оба ресурса свободны, то захват одного из них не к чему не приводит.

Операция "захват и освобождение" должна быть атомарной (потокобезопасной)

Примерный код

Resource a = new Resource();
Resource b = new Resource();

using (DoubleLockSwitch dls = new DoubleLockSwitch(a, b)
{
    dls.Lock(a);
    //work
    if (condition)
    {
        dls.Lock(b);
        // work
    }
    //work
}


Есть ли такая блокировка в готовом виде? Можно ли её реализовать с помощью других примитивов синхронизации?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Отредактировано 16.09.2015 14:35 igor-booch . Предыдущая версия . Еще …
Отредактировано 16.09.2015 14:05 igor-booch . Предыдущая версия .
Отредактировано 16.09.2015 13:51 igor-booch . Предыдущая версия .
Отредактировано 16.09.2015 13:51 igor-booch . Предыдущая версия .
Отредактировано 16.09.2015 13:47 igor-booch . Предыдущая версия .
Отредактировано 16.09.2015 13:44 igor-booch . Предыдущая версия .
Отредактировано 16.09.2015 13:41 igor-booch . Предыдущая версия .
Отредактировано 16.09.2015 13:39 igor-booch . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.