我正在处理两个线程,试图在 main() 中生成一次种子(时间(空))播种的随机数。程序不断出现分段错误,直到我发现在使用线程时我们必须为它们自己的例程中的所有线程生成随机数,然后没有分段错误。
我试图在谷歌上找到答案,为什么我们必须为所有线程独立播种,但没有找到足够令人信服的答案。谁能解释一下?谢谢!!
我正在处理两个线程,试图在 main() 中生成一次种子(时间(空))播种的随机数。程序不断出现分段错误,直到我发现在使用线程时我们必须为它们自己的例程中的所有线程生成随机数,然后没有分段错误。
我试图在谷歌上找到答案,为什么我们必须为所有线程独立播种,但没有找到足够令人信服的答案。谁能解释一下?谢谢!!
给你一个简短而直接的答案:
rand()
不是线程安全的。
不应该在没有显式临界区的情况下从多个线程调用它。
正如 Dariusz 所提到的,问题在于 rand() 不是线程安全的。
但是,您可以使用 nrand48 ( http://linux.about.com/library/cmd/blcmdl3_nrand48.htm ),它将用于种子的存储作为参数。
通过这种方式,您可以将不同的种子存储与每个线程相关联,这样对随机数生成器的调用将在不同的内存区域上运行。
如果这不是用于密码学,而是用于蒙特卡洛情况或类似的情况,那么 Mersenne Twister 是一个很好的解决方案。特别是这个版本http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html 已经专门针对并行或线程使用进行了调整。这项工作是由原作者完成的,PRNG 的周期很长。