13

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

4

5 回答 5

11

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

于 2008-09-27T06:28:11.880 回答
3

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

然而,Jeff 补充说,对于 MSVCRT 的多线程版本,rand()的状态保存在线程本地存储中,所以仍然可以。

于 2008-09-27T06:24:27.597 回答
2

Visual Studio 附带运行时库的源代码。虽然其中一些可能相当痛苦,但 rand_s() 非常简单。

rand_s() 所做的只是调用 ADVAPI32.DLL 中的 SystemFunction036() 来获取随机值。ADVAPI32.DLL 中的任何内容都应该是线程安全的。

就其本身而言, rand_s() 以线程安全的方式获取指向该函数的指针。

于 2008-09-27T06:32:23.587 回答
0

我不知道 rand_s 是否是线程安全的,但似乎它可能是,因为它似乎往返于操作系统以获取熵。(只要你链接到 VC++ 多线程 CRT,如果你链接到单线程,所有的赌注都没有)

如果 Windows CRT 支持它,您可以尝试调用 rand_r,它是 rand 的 posix 可重入版本。或者甚至更好的 boost::random,如果你已经在使用 boost。

考虑到多线程将很快普及,没有人应该在新代码中再使用 rand() - 总是尝试使用 rand_r/rand_s/boost/各种平台相关的安全 rands/等。

于 2008-09-27T06:53:47.310 回答
-2

我想不出任何理由 rand_s() 甚至 rand() 都不是线程安全的。

于 2008-09-27T06:16:52.983 回答