就像标题一样。怀疑是这样,但我在任何明确说明的地方都找不到。对于这个属性,我不想依赖猜测。
5 回答
Chris 说:rand()
不是线程安全的,因为它的内部状态是静态的,但是rand_s()
应该是线程安全的。
然而,Jeff 补充说,对于 MSVCRT 的多线程版本,rand()
的状态保存在线程本地存储中,所以仍然可以。
Visual Studio 附带运行时库的源代码。虽然其中一些可能相当痛苦,但 rand_s() 非常简单。
rand_s() 所做的只是调用 ADVAPI32.DLL 中的 SystemFunction036() 来获取随机值。ADVAPI32.DLL 中的任何内容都应该是线程安全的。
就其本身而言, rand_s() 以线程安全的方式获取指向该函数的指针。
我不知道 rand_s 是否是线程安全的,但似乎它可能是,因为它似乎往返于操作系统以获取熵。(只要你链接到 VC++ 多线程 CRT,如果你链接到单线程,所有的赌注都没有)
如果 Windows CRT 支持它,您可以尝试调用 rand_r,它是 rand 的 posix 可重入版本。或者甚至更好的 boost::random,如果你已经在使用 boost。
考虑到多线程将很快普及,没有人应该在新代码中再使用 rand() - 总是尝试使用 rand_r/rand_s/boost/各种平台相关的安全 rands/等。
我想不出任何理由 rand_s() 甚至 rand() 都不是线程安全的。