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.
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 и так далее, которая будет захватывать локи в нужном порядке
Minoru но вообще с этим подходом получается иерархия, в которой каждая вызываемая функция может захватить ещё локов, но не может ничего отпустить. Это плохо
Minoru выходит, что локи нужно разбивать на группы в зависимости от того, кто с кем одновременно захватывается, причём каждый лок может принадлежать только одной группе, чтобы гарантировать, что его никогда не захватывают отдельно от остальной группы