Прочитав фантастический сообщение в блоге Бартоша Милевски о STM, я был взволнован, прочитав следующий:
Но учтите важный факт: STM очень мелкозернистый. Например, когда вы вставляете элемент в дерево, транзакция STM блокирует только те узлы, которые вы фактически изменяете. STM легко превзойдет решение, использующее одну глобальную блокировку для всего дерева.
Однако, насколько я понимаю, такое поведение не является автоматическим, не так ли? Если я использую TVar (Map k a)
, не будет ли он действовать как единая глобальная блокировка на всей карте? И чтобы получить выгоду от этого мелкозернистого поведения, мне (или кому-то другому) пришлось бы реализовать замену карты (например, TMap
), которая содержит TVars
внутри, верно?
Это может показаться очевидным вопросом, но, читая о реализации STM, я запутался между чтением TVar
s и чтением ячеек памяти. Я просто хочу убедиться, что я прав!
Бартош продолжает:
Ручную блокировку для каждого узла трудно реализовать правильно из-за риска взаимоблокировок.
Насколько я понимаю, разница с STM заключается в том, что, хотя реализация STM фактически использует блокировки так же, как решение с ручной блокировкой, фактическое получение и освобождение блокировок обрабатывается средой выполнения, а не программистом - верно?
TVar
s, а неTVar (Map k v)
. - person Thomas M. DuBuisson   schedule 02.04.2014Map
, или мне нужно будет полностью переделатьMap
для внутреннего использованияTVar
? - person Daniel Buckmaster   schedule 02.04.2014TVar
s. Точнее,Map k (TVar v)
. - person Thomas M. DuBuisson   schedule 02.04.2014