在寻找线程安全的随机生成器时,我发现了一个 mersenne twister 生成器类,作者说它是线程安全的:
http://www.umiacs.umd.edu/~yangcj/mtrnd.html
但是在研究了代码之后,我看不出它是否是安全线程。那里没有任何类型的锁或任何类似于锁变量的东西。
这个实现真的是线程安全的吗?如果是这样,魔法是什么?
在寻找线程安全的随机生成器时,我发现了一个 mersenne twister 生成器类,作者说它是线程安全的:
http://www.umiacs.umd.edu/~yangcj/mtrnd.html
但是在研究了代码之后,我看不出它是否是安全线程。那里没有任何类型的锁或任何类似于锁变量的东西。
这个实现真的是线程安全的吗?如果是这样,魔法是什么?
Multiple stream Mersenne Twister 讨论了如何制作多流 Mersenne Twister 随机数生成器,以及http://theo.phys.sci.hiroshima-u的实现(即 Fortran 95 中的源代码) .ac.jp/~ishikawa/PRNG/mt_stream_en.html。该方法在 Mersenne Twister 序列中相距较远的点启动多个流,保证多个流相互独立,不会产生相同的随机数序列。不需要锁,因此并行代码中没有潜在的瓶颈;通过 id 访问单独的流。
从可以同时使用两个不同的 MersenneTwist 对象的意义上说,它似乎是线程安全的。如果不使用锁保护它,就不能在两个线程中使用同一个对象。
我猜作者谈论使用的全局或静态变量的原始 C 版本,所以这是一个改进。