回答編集履歴
2
refine
answer
CHANGED
@@ -13,9 +13,10 @@
|
|
13
13
|
|
14
14
|
> rand()、srand()のようなグローバル変数で実装されている関数は単純に排他的制御(ロック機能)をプログラマ側で用意すればマルチスレッドでも安全に利用可能ですよね??
|
15
15
|
|
16
|
-
適切に排他制御を行えば、マルチスレッド環境でも異なるスレッドから“安全”に呼び出し可能です。ただし、そのときの
|
16
|
+
適切に排他制御を行えば、マルチスレッド環境でも異なるスレッドから“安全”に呼び出し可能です。ただし、そのときの振る舞いが望ましい結果になるか否かは十分注意が必要です。現実的には、グローバル変数や静的変数に依存する関数を、マルチスレッド環境で利用することは出来ません。
|
17
|
+
(ここでいう“安全”とは、C/C++言語仕様的には問題無いという狭い意味にすぎません。)
|
17
18
|
|
18
|
-
`rand()`の場合
|
19
|
+
乱数を生成する `rand()` の場合、複数スレッドからどのような順序で関数が呼び出されても乱数列に代わりありません。リエントラント(reentrant)でない関数、例えば `strtok()` などの「外から見えない内部状態を保持する関数」では、複数スレッドから任意の順序で呼び出されると各スレッド上で得られる振る舞いが予測不可能になってしまい、事実上使い物になりません。
|
19
20
|
|
20
21
|
---
|
21
22
|
|
1
refine
answer
CHANGED
@@ -13,8 +13,10 @@
|
|
13
13
|
|
14
14
|
> rand()、srand()のようなグローバル変数で実装されている関数は単純に排他的制御(ロック機能)をプログラマ側で用意すればマルチスレッドでも安全に利用可能ですよね??
|
15
15
|
|
16
|
-
|
16
|
+
適切に排他制御を行えば、マルチスレッド環境でも異なるスレッドから“安全”に呼び出し可能です。ただし、そのときの関数の振る舞いが望ましいか否かは十分注意が必要です。ここでいう“安全”は、C/C++言語仕様的には問題がないことまでしか言っていません。
|
17
17
|
|
18
|
+
`rand()`の場合は、複数スレッドからどのような順序で関数が呼び出されても乱数に代わりありません。リエントラント出ない関数、`strtok()` などの「内部状態を保持する関数」では、複数スレッドから任意の順序で呼び出されてしまうと、それぞれのスレッドで得られる振る舞いが予測不可能になってしまい事実上使い物になりません。
|
19
|
+
|
18
20
|
---
|
19
21
|
|
20
22
|
> そもそもライブラリとして提供しているものがスレッドセーフでない・・・という事自体問題であるような気します。
|