Can someone explain how atomicModifyIORef
works? In particular:
(1) Does it wait for a lock, or optimistically try and retry if there's contention (like TVar
).
(2) Why is the signature of atomicModifyIORef
different to the signature of modifyIORef
? In particular, what is this extra variable b
?
Edit: I think I've figured out the answer to (2), in that b
is a value to be extracted (this can be empty if not needed). In a single threaded program, knowing the value is trivial, but in a multithreaded program, one may want to know what the previous value was at the time of the function being applied. I assume this is why modifyIORef
doesn't have this extra return value (as such usages of modifyIORef
with this return value probably should use atomicModifyIORef
anyway. I'm still interested in the answer to (1) though.