Expand keylock task description

This commit is contained in:
Fedor Korotkiy 2023-03-27 19:27:25 +04:00
parent ef02a29299
commit 0ee100730b

View file

@ -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