Кто-нибудь может объяснить, как работает atomicModifyIORef
? В частности:
(1)Ожидает ли он блокировку или оптимистично пытается повторить попытку, если есть конфликт (подобныйTVar
).
(2)Почему подписьatomicModifyIORef
отличается от подписиmodifyIORef
? В частности, что это за дополнительная переменная b
?
Редактировать:Я думаю, что нашел ответ на (2), в том, что b
— это значение, которое нужно извлечь (это может быть пустым, если не нужно). В однопоточной программе узнать значение тривиально, но в многопоточной программе может потребоваться узнать, каким было предыдущее значение во время применения функции. Я предполагаю, что именно поэтому modifyIORef
не имеет этого дополнительного возвращаемого значения (, поскольку такое использование modifyIORef
с этим возвращаемым значением, вероятно, должно в любом случае использовать atomicModifyIORef
. Однако меня все еще интересует ответ на (1).