就像标题一样。怀疑它是,但我无法在任何明确说明的地方找到它。对于这个属性,我不想依赖猜测。

有帮助吗?

解决方案

如果您使用多线程版本CRT,所有函数都是线程安全的,因为任何特定于线程的信息都存储在 TLS中。 rand_s实际上并不首先使用状态信息,因为它只调用OS API,因此rand_s不会出现线程安全问题。然而,rand()依赖于种子值来生成随机数。

其他提示

Chris说: rand()不是线程安全的,因为它的内部状态是静态的,但是 rand_s()应该是线程安全的。

杰夫补充说,对于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()不是线程安全的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top