Haskell STM: Как реализовать Obstruction Free STM с использованием Haskell?
Я хочу внедрить Obstruction Free STM (OFTM) с использованием Haskell для сравнения различных доступных политик управления конфликтами. Например, Транзакция T1 получает Tvar, скажем X, и все же совершает. Теперь другая транзакция T2 хочет получить доступ к X. В Haskell STM T2 блокируется и повторяется позже. Я хочу, чтобы Транзакция выполнялась неблокирующим образом, когда T2 прерывает T1 или отменяет ее в течение некоторого произвольного времени, консультируясь с менеджером по конфликтам. И T1 повторится позже. Как это происходит в случае агрессивного диспетчера конфликтов, который всегда решает прервать транзакцию противника во время конфликта. Это просто эксперимент, который я хочу сделать. Заранее спасибо.
1 ответ
Первое: реализация STM по умолчанию не блокирует конфликтующие транзакции. Скорее, каждая транзакция выполняется на полной скорости, а конфликты обнаруживаются только на этапе фиксации. Когда транзакция пытается выполнить фиксацию, она либо успешно выполняется, либо прерывается и немедленно перезапускает транзакцию. Это ни в коем случае не "блок". (Возможно, вы думаете о retry
примитив, который блокирует транзакции.)
Второе: возникла проблема с "Читателем монад" (нет, я не помню, какой номер), в котором описана реализация STM, где конфликты транзакций немедленно откатывают одну из конфликтующих транзакций (которая зависит от времени). Вы можете найти это интересным. (С другой стороны, код недоступен, поэтому...)
Изменить: это был выпуск 15 (последний раздел).