【问题标题】:rand() with multiple threads [duplicate]具有多个线程的 rand() [重复]
【发布时间】:2013-03-02 21:46:59
【问题描述】:

我正在处理两个线程,试图在 main() 中生成一次种子 (time(null)) 播种的随机数。程序不断出现分段错误,直到我发现在使用线程时我们必须为它们自己的例程中的所有线程生成随机数,然后没有分段错误。

我试图在谷歌上找到关于为什么我们必须为所有线程独立播种的答案,但没有找到足够令人信服的答案。谁能解释一下? 谢谢!!

【问题讨论】:

标签: c multithreading


【解决方案1】:

给你一个简短而直接的答案:

rand() 不是线程安全的。

不应在没有显式临界区的情况下从多个线程调用它。

【讨论】:

    【解决方案2】:

    如果这不是用于密码学,而是用于蒙特卡洛情况或类似的情况,那么 Mersenne Twister 是一个很好的解决方案。特别是这个版本http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html 已专门针对并行或线程使用进行了调整。工作由原作者完成,PRNG周期很长。

    【讨论】:

      【解决方案3】:

      正如 Dariusz 所说,问题在于 rand() 不是线程安全的。

      但是,您可以使用 nrand48 (http://linux.about.com/library/cmd/blcmdl3_nrand48.htm),它将用于种子的存储作为参数。

      通过这种方式,您可以为每个线程关联一个不同的种子存储,这样对随机数生成器的调用将在不同的内存区域上运行。

      【讨论】:

        猜你喜欢
        • 2014-12-04
        • 2011-09-03
        • 1970-01-01
        • 2019-09-02
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多