From 0ee100730b981d26be10d9335d8eed49537c83ac Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Mon, 27 Mar 2023 19:27:25 +0400 Subject: [PATCH] Expand keylock task description --- keylock/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) 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