就像标题一样。 怀疑它是,但我找不到明确指出的任何地方。 而对于这个属性,我不想依赖投机。
为什么emacs有时会在我的文件顶部插入奇怪的字符?
Windows上的drand48
如何在Linux中使用C语言来发音?
打印一个随机数返回一个负数。 (的/ dev / urandom的)
什么是PHP的mt_rand()最小值以及如何计算32位Linux机器上的32位整数
如果使用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()不是线程安全的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。