Нет, все будет работать нормально. Как именно будут взаимодействовать два потока, зависит от
логика повторения.
Например, допустим, у вас есть:
ten tv = do
n <- readTVar tv
when (n < 7) retry
writeTVar tv 0
-- do something that takes about 10 seconds
one tv = do
modifyTVar tv (+1)
-- do something that takes about 1 second
Таким образом, поток "ten
" будет в состоянии повторной попытки, пока TVar не достигнет
значение 7, тогда оно продолжится.
Обратите внимание, что вы не можете напрямую контролировать, сколько времени займут эти вычисления
внутри монады СТМ. Это было бы побочным эффектом, и побочные эффекты не являются
разрешено в расчетах СТМ. Единственный способ общения с внешним миром
мир через значения, передаваемые через транзакционную память.
И это означает, что если логика "передачи эстафеты" через транзакционную память
правильно, программа будет работать правильно независимо от точной суммы
времени любая часть этого занимает. Это часть гарантии STM.