memory ordering

Christian Höner zu Siederdissen choener at
Fri Dec 20 08:57:17 UTC 2013

Hi John,

I guess you probably want to "pseq x". See below for an example. Since your 2nd
action does not depend on your 1st.


import Debug.Trace
import GHC.Conc

main = do
  x <- return (traceShow "1" $ 1::Int)
  -- x `pseq` print (2::Int)
  print (2::Int)
  print x

* John Lato <jwlato at> [20.12.2013 02:36]:
>    Hello,
>    I'm working on a lock-free algorithm that's meant to be used in a
>    concurrent setting, and I've run into a possible issue.
>    The crux of the matter is that a particular function needs to perform the
>    following:
>    > x <- vec ix
>    > position <- readIORef posRef
>    and the algorithm is only safe if these two reads are not reordered (both
>    the vector and IORef are written to by other threads).
>    My concern is, according to standard Haskell semantics this should be
>    safe, as IO sequencing should guarantee that the reads happen in-order. 
>    Of course this also relies upon the architecture's memory model, but x86
>    also guarantees that reads happen in order.  However doubts remain; I do
>    not have confidence that the code generator will handle this properly.  In
>    particular, LLVM may freely re-order loads of NotAtomic and Unordered
>    values.
>    The one hope I have is that ghc will preserve IO semantics through the
>    entire pipeline.  This seems like it would be necessary for proper
>    handling of exceptions, for example.  So, can anyone tell me if my worries
>    are unfounded, or if there's any way to ensure the behavior I want?  I
>    could change the readIORef to an atomicModifyIORef, which should issue an
>    mfence, but that seems a bit heavy-handed as just a read fence would be
>    sufficient (although even that seems more than necessary).
>    Thanks,
>    John L.

> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <>

More information about the Glasgow-haskell-users mailing list