Expand keylock task description
This commit is contained in:
parent
ef02a29299
commit
0ee100730b
1 changed files with 25 additions and 0 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue