我必须选择0到3之间的随机数。我必须多次调用此函数。一开始它始终有效,但过了一段时间后会出现错误消息Tread 1: EXC_BAD_ACCESS(code =2, address 0x7fff5f3ffff8
。
这是我的代码。 m_p[multiproject][project]
等于4
;
int selecteer_random_resource(int multiproject, int project)
{ int k=0;
k=rand()%m_p[multiproject][project];
return k;
}
我真的不明白为什么它在开始时工作,一段时间后出现错误。
答案 0 :(得分:0)
rand()
不线程安全,它在文档中也是如此。
引用https://stackoverflow.com/a/6161352/4433386:
那说,文件说明:
函数rand()不是可重入或线程安全,因为它使用在每次调用时修改的隐藏状态。这可能只是 下一次调用将使用的种子值,或者它可能更多 阐述。为了在线程中获得可重现的行为 应用程序,必须明确这个状态。函数rand_r() 提供了一个指向unsigned int的指针,用作状态。 这是一个非常少量的状态,所以这个功能将是一个弱点 伪随机发生器。请尝试drand48_r(3)。
以上强调部分可能是你所有人的原因 线程得到相同的数字。
尤其是在2015年,您应该使用线程安全的随机数生成器。 Boost / C ++ 11具有<random>
标准库,包含用于线程安全生成随机数的强大方法。
如果你不能使用boost或C ++ 11,你也可以试试drand
,例如drand48_r