使用 C# 的随机数生成器确保线程安全
C# 的内置 Random.Next()
方法不是线程安全的。 在多线程应用程序中使用它可能会由于竞争条件而导致错误的结果。 幸运的是,创建线程安全版本非常简单。
线程安全的随机数生成器
下面的ThreadSafeRandom
类提供了一种使用线程静态变量来保证线程安全的解决方案。每个线程都有自己独立的Random
实例。
<code class="language-csharp">public class ThreadSafeRandom { private static readonly Random _global = new Random(); [ThreadStatic] private static Random _local; public int Next() { if (_local == null) { int seed; lock (_global) { seed = _global.Next(); } _local = new Random(seed); } return _local.Next(); } }</code>
唯一随机数的种子管理
多个 Random
实例的一个常见问题是生成相似或相同的数字,尤其是在快速连续创建时。 此实现通过使用全局 Random
实例 (_global
) 为每个线程本地 Random
实例 (_local
) 生成唯一的种子来解决此问题。 lock
语句可防止访问全局 Random
进行种子生成时的竞争条件。
此方法确保每个线程都有不同的种子,从而产生真正随机且独立的数字序列。 开发人员现在可以在多线程应用程序中安全地使用随机数生成,避免非线程安全方法的陷阱。
以上是如何在 C# 中创建线程安全的随机数生成器?的详细内容。更多信息请关注PHP中文网其他相关文章!