Windows'rand_s线程安全吗?

就像标题一样。 怀疑它是,但我找不到明确指出的任何地方。 而对于这个属性,我不想依赖投机。

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

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可重入版本。 或者更好的提升::随机,如果你已经使用提升。

考虑普及的多线程将会如何,没有人应该在新的代码中使用rand() – 总是尝试使用rand_r / rand_s / boost /各种平台相关的安全rands / etc。

我想不出为什么rand_s()甚至rand()不是线程安全的。