teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

refine

2018/02/15 10:18

投稿

yohhoy
yohhoy

スコア6191

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

1

refine

2018/02/15 10:18

投稿

yohhoy
yohhoy

スコア6191

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
  > そもそもライブラリとして提供しているものがスレッドセーフでない・・・という事自体問題であるような気します。