就像标题一样。 怀疑它是,但我找不到明确指出的任何地方。 而对于这个属性,我不想依赖投机。
如果使用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()不是线程安全的。