Эта страница с комментариями описывает множество мелких деталей STM
в GHC, но я хотел бы прояснить пару моментов.
Во-первых, становится ли вложенная транзакция недействительной при изменении переменных, доступ к которым осуществляется в родительском объекте?
Например, у нас есть в потоке A
:
takeTMVar a `orElse` takeTMVar b `orElse` takeTMVar c
Скажем, пока A
выполняет вложенную транзакцию takeTMVar b
, другой поток B
выполняет putTMVar a ()
; может ли поток A
успешно завершить свою вложенную транзакцию или он признан недействительным (это может показаться мне неправильным)?
Второй момент, который, я думаю, я понимаю, но не возражал бы против подтверждения: в случае, когда вся транзакция верхнего уровня, описанная выше для A
, повторяется и, наконец, блокируется, правильно ли, что A
будет просыпаться при изменении любого из a
, b
или c
?
Наконец, в качестве бонуса, изменится ли семантика приведенной выше транзакции, если мы (или авторы библиотеки) изменим orElse
на infixr
?