Size: a a a

2021 May 25

c

codingteam@cjr in codingteam
portnov
ну как минимум в типе видно, в каком порядке ты их берёшь
источник

c

codingteam@cjr in codingteam
portnov
наверное дальше можно что-нибудь сверху прикрутить, как-нибудь типизировать fork, чтобы у всех детей был одинаковый порядок локов
источник

c

codingteam@cjr in codingteam
Minoru
> Code that uses STM will not deadlock, but it is possible for threads to starve each other to some degree. A long-running transaction can cause another transaction to retry often enough that it will make comparatively little progress.

http://book.realworldhaskell.org/read/software-transactional-memory.html
источник

c

codingteam@cjr in codingteam
Minoru
но книжке сто лет в обед и она скорее вводная, не исключено, что какие-то детали опущены
источник

c

codingteam@cjr in codingteam
Minoru
у Сноймана есть пост про дедлоки и исключения, но я сходу не смог понять, имеет это отношение к STM или нет
источник

c

codingteam@cjr in codingteam
portnov
https://stackoverflow.com/questions/52071821/thread-blocked-indefinitely-in-an-stm-transaction-in-a-case-where-threads-are вот вроде как раз детектор дедлоков срабатывает у товарища
источник

c

codingteam@cjr in codingteam
Minoru
кстати, мой ReaderT тоже не решает проблему с порядком. Но можно вместо того, чтобы показывать локи всем пользователям этого ReaderT, написать функцию withLock :: (a -> ReaderT (locks - lock a) b) -> ReaderT locks b и withLock2 :: (a -> b -> ReaderT (locks - lock a - lock b) c) -> ReaderT locks c и так далее, которая будет захватывать локи в нужном порядке
источник

c

codingteam@cjr in codingteam
Minoru
но вообще с этим подходом получается иерархия, в которой каждая вызываемая функция может захватить ещё локов, но не может ничего отпустить. Это плохо
источник

c

codingteam@cjr in codingteam
portnov
я не уверен, что это плохо
источник

c

codingteam@cjr in codingteam
portnov
по-моему, если лок берёт одна функция, а отпускает другая, то как раз очень легко выстрелить в ногу
источник

c

codingteam@cjr in codingteam
Minoru
я не об этом
источник

c

codingteam@cjr in codingteam
Minoru
представь, что есть два ресурса типов a и b, которые защищены локами
источник

c

codingteam@cjr in codingteam
Minoru
я хочу захватить оба лока, что-то проверить, потом отпустить a, поработать с b, потом отпустить b
источник

c

codingteam@cjr in codingteam
Minoru
withLock2 использовать нельзя, потому что он и хватает, и отпускает оба лока сразу
источник

c

codingteam@cjr in codingteam
Minoru
придётся брать сначала b, потом a, потом отпускать a, потом отпускать b
источник

c

codingteam@cjr in codingteam
Minoru
при этом если другой тред делает withLock2 и пытается захватить a и b, то у нас может быть дедлок
источник

c

codingteam@cjr in codingteam
portnov
у меня возможно профдеформация от использования оракловых локов :)
источник

c

codingteam@cjr in codingteam
Minoru
выходит, что локи нужно разбивать на группы в зависимости от того, кто с кем одновременно захватывается, причём каждый лок может принадлежать только одной группе, чтобы гарантировать, что его никогда не захватывают отдельно от остальной группы
источник

c

codingteam@cjr in codingteam
Minoru
но в этом случае каждая группа фактически является одним локом, т.к. все локи группы захватываются одновременно
источник

c

codingteam@cjr in codingteam
portnov
но в результате интуитивно кажется, что отпускать локи по одному вообще плохая идея
источник