diff --git a/keylock/README.md b/keylock/README.md index 552d7a8..390142b 100644 --- a/keylock/README.md +++ b/keylock/README.md @@ -2,6 +2,31 @@ Напишите примитив синхронизации, позволяющий "лочить" строки из множества. +В обычном `sync.Mutex` лок всего один. В один момент времени этот лок может находиться +у одной горутины. В нашем примитиве локов может быть сколько угодно. Каждый лок мы идентифицируем +ключём - строкой. Каждая горутина приходит к нам со списком ключей и хочет захватить сразу +все локи из этого списка. + +В итоге, внутри критической секции может быть сколько угодно горутин, но у всех них множества +ключей попарно не пересекаются. + +Например, если к нам придёт 3 горутины: + + 1. `LockKeys({a, b})` + 2. `LockKeys({b})` + 3. `LockKeys({c})` + +То в критической секции одновременно могут находиться: + + * 1 и 3 + * 2 и 3 + +А вот 1 и 2 одновременно в критическую секцию зайти не могут, потому что у них множества ключей пересекаются. + +Метод `LockKeys` должен блокироваться, пока не удастся +захватить все ключи, либо пока операция не будет +отменена через канал `cancel`. + ```go package keylock