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