Index: Mono.Math/BigInteger.cs =================================================================== --- Mono.Math/BigInteger.cs (revision 81399) +++ Mono.Math/BigInteger.cs (working copy) @@ -500,11 +500,36 @@ #endregion #region Random + + private class ThreadSafeRandomNumberGenerator : RandomNumberGenerator { + + static object locker = new object (); + private RandomNumberGenerator rng; + + public ThreadSafeRandomNumberGenerator () + { + rng = RandomNumberGenerator.Create (); + } + + public override void GetBytes (byte[] data) + { + lock (locker) + rng.GetBytes (data); + } + + public override void GetNonZeroBytes (byte[] data) + { + lock (locker) + rng.GetNonZeroBytes (data); + } + } + + [ThreadStatic] private static RandomNumberGenerator rng; private static RandomNumberGenerator Rng { get { if (rng == null) - rng = RandomNumberGenerator.Create (); + rng = new ThreadSafeRandomNumberGenerator (); return rng; } }