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
|
```go
|
||||||
package keylock
|
package keylock
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue