Atomically modifies the contents of an
IORef.
This function is useful for using
IORef in a safe way in a
multithreaded program. If you only have one
IORef, then using
atomicModifyIORef to access and modify it will prevent race
conditions.
Extending the atomicity to multiple
IORefs is problematic, so
it is recommended that if you need to do anything more complicated
then using
MVar instead is a good idea.
atomicModifyIORef does not apply the function strictly. This is
important to know even if all you are doing is replacing the value.
For example, this will leak memory:
ref <- newIORef '1'
forever $ atomicModifyIORef ref (\_ -> ('2', ()))
Use
atomicModifyIORef' or
atomicWriteIORef to avoid this
problem.