とっておきの「まかない飯」を教えて下さい!

今、DLLについて勉強しているのですが動作について、不明点があり質問しています。

単純にDLL内に下記のようにMyFuncという関数があったとします。
(コンパイルは/MTを付けています)

MyFunc (){
int i;

for(i=0;i<10;i++){
printf("%d\n");
}
}

これをDLLを呼び出すアプリから複数のスレッドで呼び出したとき、それぞでのスレッド毎に、カウントが増えていきます。
DLLはメモリ共有されると思っているのですが、そうではないのか、いまいちわからない状態でご教授いただければと思っています。

このカウントが別々に増えるのは、コードの領域とデータの領域が別ベルだからと考えればよいのでしょうか?
コードは同じ領域を使用して、データは別の領域を使用しているのでしょうか?

次にここで使用しているint iをグローバル変数にすると、カウントはスレッド毎に共有されてしまいます。
グローバル変数にすると、この場合のint iはコードの領域に置かれるということなんでしょうか?

ちょっと、的を得ていない質問かもしれませんが、何卒、よろしくお願いいたします。

A 回答 (2件)

>>このカウントが別々に増えるのは、コードの領域とデータの領域が別ベルだからと考えればよいのでしょうか?



ほぼ、そう思って問題ないかと思います。

補足するとスレッドが生成された時に、生成したスレッドに対し新しいスタック領域が生成され割り当てされます。

MyFunc内で宣言された変数iは各スレッドのスタック領域に確保されるため、それぞれのスレッド毎にカウントされることになります。


>>グローバル変数にすると、この場合のint iはコードの領域に置かれるということなんでしょうか?
コード領域ではありませんが、固定領域に置かれます。
    • good
    • 0

マルチスレッドやDLLとは関係なく、



関数内で変数を宣言すると、関数内でしか扱えません。
スレッドAとBからMyFuncをコールしても、動的にデータ領域を確保(スタック)
し、関数を出ると開放されるので独立した存在で影響を与えません。

仮にシングルスレッドで二回MyFuncをコールしても各カウンタ変数は独立しています。

変数のスコープを認識すると理解できると思います。

参考URL:http://www.geocities.jp/ky_webid/c/022.html
    • good
    • 1

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


おすすめ情報