dポイントプレゼントキャンペーン実施中!

たとえば

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

A 回答 (2件)

ローカル変数は呼び出しごとに異なる領域が割り当てられます。


だから大丈夫。再帰関数が定義できるのも同じ理由です。
    • good
    • 1
この回答へのお礼

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

お礼日時:2009/05/09 18:26

ローカル変数は、スタック上に取られます。


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

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

お礼日時:2009/05/09 18:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!