Windows的rand_s线程安全吗?
-
02-07-2019 - |
题
就像标题一样。怀疑它是,但我无法在任何明确说明的地方找到它。对于这个属性,我不想依赖猜测。
其他提示
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()不是线程安全的原因。
不隶属于 StackOverflow