- ベストアンサー
C言語である関数への同時アクセスについて
たとえば int function() { int value = rand(); //ランダムな数を取得 for ( int i = 0; i < 100000; i++ ) //数百ミリ秒くらい待機 ; return value; } こんな関数を作成します。 これをマルチスレッドで同時に動かすとします。 例えばAというスレッドとBという2つのスレッドで同時に function()を呼び出すとします。 この場合Aというスレッドを呼び出してvalueに100が代入されたとして、 その後forループで待機している間に スレッドBからもfunction()が呼び出されvalueに200が代入されたとしたら、 スレッドAもスレッドBもfunctionの返す値はどっちも200になってしまうのでしょうか? 環境はWindowsXPでコンパイラはVisual Studio2005または2008を想定していますが、 一般的なCやC++の仕様ではこの場合の挙動はどうなるのでしょう?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ローカル変数は呼び出しごとに異なる領域が割り当てられます。 だから大丈夫。再帰関数が定義できるのも同じ理由です。
その他の回答 (1)
- zwi
- ベストアンサー率56% (730/1282)
回答No.2
ローカル変数は、スタック上に取られます。 スタックは呼び出されるたびに新しい場所を確保する(厳密には違いますが)ので心配要りません。特に別のスレッド同士が同じスタックを使うことは絶対ありませんので安心してください。 ただし、グローバル変数だと心配されている通りの事がおきます。
質問者
お礼
グローバルやstaticだと同じ領域を使用してしまうんですね。 今度から気をつけることにします。ありがとうございました!
お礼
そうだったんですね。 今まで同じ領域を使うんじゃないかと心配して気が気ではありませんでした。 回答ありがとうございます!