Size: a a a

2020 October 26

MP

Misha Puzanov in Haskell
Aminion
Есть ли какие общеизвестные проблемы у STM/TVar, приводящие к потере апдейтов, при изменении в одном пакете, и считовании в другом?
в прицнипе "потеря апдейтов" может происходить, stm не гарантирует что каждый ридер будет пробужен, чтобы увидеть каждый аптейт TVar-ов, на которых он сделал retry
источник

MP

Misha Puzanov in Haskell
то есть, как я понимаю, единственный способ гарантированно увидеть все апдейты — это писать из в TChan
источник

AV

Alexander Vershilov in Haskell
+
источник

к

кана in Haskell
Misha Puzanov
в прицнипе "потеря апдейтов" может происходить, stm не гарантирует что каждый ридер будет пробужен, чтобы увидеть каждый аптейт TVar-ов, на которых он сделал retry
хм, а почему не гарантирует?
источник

AV

Alexander Vershilov in Haskell
Или queue, не важно
источник

MP

Misha Puzanov in Haskell
ну или писать в TChan что-то, что сигнализирует об апдейте
источник

AV

Alexander Vershilov in Haskell
А с чего бы должен?
источник

к

кана in Haskell
мол если придет новый апдейт, то он возьмет новый вместо предыдущего?
источник

к

кана in Haskell
да, понял
источник

к

кана in Haskell
это логично
источник

AV

Alexander Vershilov in Haskell
Мы же читаем не апдейт, а новое состояние, какое есть в текущий момент времени
источник

AV

Alexander Vershilov in Haskell
У Дункана в его докладе это было важной фичей
источник

к

кана in Haskell
ну я ожидал, что как только происходит апдейт, сразу вызываются все ридеры, и какой первый успеет завершить транзакцию, тот и победит, а остальные будут ретраится

но это значит, что другие ридеры могут просто не успеть прочитать значение, пока будут читать другой твар скажем
источник

к

кана in Haskell
или они по очереди выполняются?
источник

AV

Alexander Vershilov in Haskell
Все сразу
источник

к

кана in Haskell
если у меня будет два одинаковых треда, каждый будет читать и сразу обновлять значение, то всегда будет работать только первый, а второй вечно ретраится?
источник

к

кана in Haskell
ок
источник

AV

Alexander Vershilov in Haskell
Да, могут не успеть прочитать обновление, порядок пробуждений и работы в stm не специфицирован, by design
источник

MP

Misha Puzanov in Haskell
кана
хм, а почему не гарантирует?
не знаю, но думаю, что поскольку retry может происходить на каком угодно user defined условии, нарантировать что-то в общем случае невозможно. Точнее _наверное_ возможно, но это будет неэффективно или дедлокаться или еще чего-то такое. Поэтому retry — это просто "попробуй еще раз, если ситуация поменялась" и неважно, что она поменялась еще 100 раз с тех пор. Собственно, поэтому и нет fairness и треды могут голодать бесконечно и все такое.
источник

JS

Jerzy Syrowiecki in Haskell
Ilya Kos
По идее immutability и функциональность ортогональные (?)
нет, ФП легче использовать с immutability
источник