【发布时间】:2011-07-05 23:29:50
【问题描述】:
如果从多个线程同时调用同一个 System.Random 实例的 NextDouble() - 没有任何锁定,那么会出现哪些错误/问题(如果有)?
【问题讨论】:
-
用种子的互锁设置编写你自己的随机数。如果你有好的种子,写一个并发的“线性同余生成器”是很容易的。
标签: .net multithreading random generator
如果从多个线程同时调用同一个 System.Random 实例的 NextDouble() - 没有任何锁定,那么会出现哪些错误/问题(如果有)?
【问题讨论】:
标签: .net multithreading random generator
如果不对实现进行完全逆向工程,就很难判断。但是,可能发生的一件事是同一“随机”数连续多次返回(跨多个线程)。
【讨论】:
简而言之,System.Random 不是线程安全的。
如需更长的答案,请参阅this awesome post,其中详细解释了该问题。
【讨论】:
您可能会损坏该对象。 Random 对象使用种子值的内部数组,并调用 Next 更新该数组。
别这样。
【讨论】:
由于无法保证线程安全,因此没有明确或明智的方式来回答“无”、“任何事情”和“繁荣”都是有效的答案,而且它确实可以在版本、平台、架构之间发生变化,等等
您是否考虑过将其设为 [ThreadStatic],以便每个线程可以自动拥有一个独立的版本? (初始化可能应该对每个线程进行双重检查)。
【讨论】: