Сообщение Двойная блокировка переключатель от 16.09.2015 13:28
Изменено 16.09.2015 14:35 igor-booch
Блокировка эксклюзивно блокирует два ресурса.
Но не два одновременно, а напротив не допускает одновременного захвата обоих ресурсов.
Захвачен может быть только один ресурс, либо оба ресурса должны быть свободны.
Освобождение захваченного ресурса, происходит при захвате свободного ресурса.
Например, блокировка работает с 2-ми ресурсами A и B.
Предположим захвачен ресурс B
При захвате А, освобождается B
При освобождении А, B не захватывается, оба ресурса становятся свободными
И наоборот
Предположим захвачен ресурс A
При захвате B, освобождается A
При освобождении B, A не захватывается, оба ресурса становятся свободными
Не обязательно чтобы работало наоборот, мне достаточно чтобы работало только в прямом направлении (то есть ресурсы асимметричны), но если будет работать и наоборот (то есть ресурсы симметричны), то это не помешает.
Если оба ресурса свободны, то блокировка одного из них не к чему не приводит.
Операция "захват и освобождение" должна быть атомарной (потокобезопасной)
Примерный код
Есть ли такая блокировка в готовом виде? Можно ли её реализовать с помощью других примитивов синхронизации?
Но не два одновременно, а напротив не допускает одновременного захвата обоих ресурсов.
Захвачен может быть только один ресурс, либо оба ресурса должны быть свободны.
Освобождение захваченного ресурса, происходит при захвате свободного ресурса.
Например, блокировка работает с 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
}
Есть ли такая блокировка в готовом виде? Можно ли её реализовать с помощью других примитивов синхронизации?
Двойная блокировка переключатель
Блокировка эксклюзивно блокирует два ресурса.
Но не два одновременно, а напротив не допускает одновременного захвата обоих ресурсов.
Захвачен может быть только один ресурс, либо оба ресурса должны быть свободны.
Освобождение захваченного ресурса, происходит при захвате свободного ресурса.
Например, блокировка работает с 2-ми ресурсами A и B.
Предположим захвачен ресурс B
При захвате А, освобождается B
При освобождении А, B не захватывается, оба ресурса становятся свободными
И наоборот
Предположим захвачен ресурс A
При захвате B, освобождается A
При освобождении B, A не захватывается, оба ресурса становятся свободными
Не обязательно чтобы работало наоборот, мне достаточно чтобы работало только в прямом направлении (то есть ресурсы асимметричны), но если будет работать и наоборот (то есть ресурсы симметричны), то это не помешает.
Если оба ресурса свободны, то захват одного из них не к чему не приводит.
Операция "захват и освобождение" должна быть атомарной (потокобезопасной)
Примерный код
Есть ли такая блокировка в готовом виде? Можно ли её реализовать с помощью других примитивов синхронизации?
Но не два одновременно, а напротив не допускает одновременного захвата обоих ресурсов.
Захвачен может быть только один ресурс, либо оба ресурса должны быть свободны.
Освобождение захваченного ресурса, происходит при захвате свободного ресурса.
Например, блокировка работает с 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
}
Есть ли такая блокировка в готовом виде? Можно ли её реализовать с помощью других примитивов синхронизации?