Может кто-нибудь объяснить, как работает atomicModifyIORef
? В частности:Haskell: Как работает «atomicModifyIORef»?
(1) Дождаться блокировки или оптимистично попытаться повторить попытку (например, TVar
).
(2) Почему подпись atomicModifyIORef
отличается от подписи modifyIORef
? В частности, что это за переменная b
?
Редактировать: Я думаю, что я выяснил ответ на (2), в котором b
- это значение, которое нужно извлечь (это может быть пустым, если не нужно). В однопоточной программе знание значения тривиально, но в многопоточной программе, возможно, захочется узнать, каково было предыдущее значение во время применяемой функции. Я полагаю, именно поэтому modifyIORef
не имеет такого дополнительного возвращаемого значения (поскольку такие обычаи modifyIORef
с этим возвращаемым значением, вероятно, следует использовать atomicModifyIORef
в любом случае. Я по-прежнему заинтересован в ответ на (1), хотя.
Выполняет ли блокировку или оптимистично? Версия GHC, похоже, называет примитив GHC. – Clinton
Обратите внимание, что из-за лени, 'atomicModifyIORef' только должен изменить текущее значение, чтобы указать на thunk, при этом фактическая работа задерживается до тех пор, пока она не будет прочитана в более позднее время. AFAIK, он компилируется на что-то вроде CAS на большинстве платформ. – hammar
Оптимистичный, через замкнутый обмен (cas). https://github.com/ghc/ghc/blob/45740c29b24ea78b885d3b9f737a8bdc00265f7c/rts/PrimOps.cmm#L364 –