我正在研究两个线程试图在main()中生成种子(time(null))种子的随机数。程序连续出现分段故障,直到我发现在使用线程时我们必须为自己的例程中的所有线程生成随机数,然后就没有seg错误了。
我试图在谷歌上找到答案,为什么我们必须为所有线程独立播种,但没有找到足够令人信服的答案。有人可以解释一下吗? 谢谢!
答案 0 :(得分:5)
给你一个简短直接的答案:
rand()
不是线程安全的。
如果没有明确的临界区,则不应从多个线程调用它。
答案 1 :(得分:3)
如Dariusz所述,问题是rand()不是线程安全的。
但是,您可以使用nrand48(http://linux.about.com/library/cmd/blcmdl3_nrand48.htm),它将用作种子的存储作为参数。
通过这种方式,您可以为每个线程关联一个不同的种子存储,这样对随机数生成器的调用将在不同的内存区域上运行。
答案 2 :(得分:0)
如果这不是用于加密,而是用于Monte-Carlo情况或者那种情况,那么Mersenne Twister是一个很好的解决方案。特别是,此版本http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html 已针对并行或线程使用进行了专门调整。这项工作由原作者完成,PRNG有很长一段时间。