• ベストアンサー

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++の仕様ではこの場合の挙動はどうなるのでしょう?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ローカル変数は呼び出しごとに異なる領域が割り当てられます。 だから大丈夫。再帰関数が定義できるのも同じ理由です。

RockmanX
質問者

お礼

そうだったんですね。 今まで同じ領域を使うんじゃないかと心配して気が気ではありませんでした。 回答ありがとうございます!

その他の回答 (1)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

ローカル変数は、スタック上に取られます。 スタックは呼び出されるたびに新しい場所を確保する(厳密には違いますが)ので心配要りません。特に別のスレッド同士が同じスタックを使うことは絶対ありませんので安心してください。 ただし、グローバル変数だと心配されている通りの事がおきます。

RockmanX
質問者

お礼

グローバルやstaticだと同じ領域を使用してしまうんですね。 今度から気をつけることにします。ありがとうございました!

関連するQ&A