The best way to generate random values in multiple threads is to safely split your random generator every time you fork.

In the case of mwc-random, it looks like you will want to do something like 

gen' <- initialize =<< (uniformVector gen 32 :: IO (Vector Word32))
forkIO $ ... gen'
... gen

There is no good reason to share RNG state across threads. Just use a separate RNG state for every thread. This is inherently thread-safe and more performant.

If you're forking very frequently, you will want to benchmark the effect of using a more efficient vector type (i.e. Vector.Unboxed instead of Vector) or fewer elements during initialization. 



On Tue, Oct 10, 2017 at 9:06 PM, Kazu Yamamoto <kazu@iij.ad.jp> wrote:
Hi David,

Thank you for your reply.

> I've heard good things about *mwc-random* (https://github.com/bos/mwc-random
> )

Are there any example code to use mwc-random safely from multiple
threads?

// Kazu
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.