是Windows的rand_s线程安全的?(Is Windows' rand_s threa

2019-07-18 03:57发布

正如标题。 是令人怀疑的是,但我找不到它的任何地方明确规定。 而对于这个属性我不希望靠猜测。

Answer 1:

如果使用多线程的CRT的版本,所有的功能都是线程安全的,因为任何线程特定信息存储在TLS 。 rand_s居然不首先使用状态信息,因为它只是调用操作系统API,所以线程安全的问题并不存在于rand_s。 兰特(),然而取决于种子值产生一个随机数。



Answer 2:

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

但是杰夫补充说,MSVCRT的多线程版本, rand()的状态在线程本地存储中保存的,所以它的好还是。



Answer 3:

Visual Studio中提供了源的运行时库。 虽然它的一些可以是相当痛苦的涉水通过,rand_s()是非常简单的。

所有rand_s()所做的就是调用SystemFunction036()在ADVAPI32.DLL获得随机值。 任何在ADVAPI32.DLL应该是线程安全的。

就其本身而言,rand_s()获取指针到一个线程安全的方式功能。



Answer 4:

我不知道,如果rand_s是线程安全的,但现在看来似乎可能是,因为它似乎使往返于OS的熵。 (只要链接到VC ++多线程CRT,所有的赌注都关闭如果链接到单个线程之一)

如果它被Windows CRT支持的,你可以尝试调用rand_r这是兰特的POSIX重入版本。 甚至更好的提高::随机的,如果你已经使用的推动作用。

考虑到普遍的多线程将如何很快,任何人都不应再在新的代码中使用兰特() - 总是试图使用rand_r / rand_s /升压/各个平台相关的安全兰特/等。



Answer 5:

我想不出任何理由rand_s(),甚至兰特()不会是线程安全的。



文章来源: Is Windows' rand_s thread-safe?