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()スレッドセーフであるべきです。

rand()ただし、MSVCRT のマルチスレッド バージョンでは、の状態はスレッド ローカル ストレージに保持されるため、それでも問題ないとJeff は付け加えました。

于 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 がスレッドセーフかどうかはわかりませんが、エントロピーのために OS を往復しているように見えるので、おそらくそうだと思われます。(VC++ マルチスレッド CRT にリンクしている限り、シングルスレッドのものにリンクすると、すべての賭けがオフになります)

Windows CRT でサポートされている場合は、rand の posix リエントラント バージョンである rand_r への呼び出しを試すことができます。または、すでにブーストを使用している場合は、boost::random を使用することをお勧めします。

マルチスレッディングがすぐに普及することを考えると、新しいコードで rand() を使用する人はもういないはずです。

于 2008-09-27T06:53:47.310 に答える
-2

rand_s() や rand() がスレッドセーフにならない理由が思いつきません。

于 2008-09-27T06:16:52.983 に答える