3

さまざまなスレッドを生成し、それらすべてに同じメソッドを使用するように指示した場合:

internal class Program {

    private static DoSomething() {

        int result = 0;
        Thread.Sleep(1000);
        result++;
        int ID = Thread.CurrentThread.ManagedThreadId;
        Console.WriteLine("Thread {0} return {1}", ID, result);
    }

    private static Main() {

        Thread[] threads = new Thread[50];

        for (int i = 0; i < 50; i++)
            threads[i] = new Thread(DoSomething);

        foreach (Thread t in threads)
            t.Start();
    }
}   

すべてのスレッドは同じスタックを共有しますか?プログラムを実行すると、すべてのスレッドが1を返すので、答えはノーだと思いますが、それはCLRがメモリ内にメソッドの異なるコピーを作成することを意味しますか?

4

3 に答える 3

6

これは、CLRがメモリ内にメソッドの異なるコピーを作成することを意味しますか?

いいえ。.NETプログラムでメモリがどのように分割されているかを理解するのに役立ちます。全体像を描くために、多くのマイナーな実装の詳細をスキップします。これらのカテゴリでメモリを細分化できます。

  • ガベージコレクションのヒープ。オブジェクトはそこに格納され、new演算子(構造体を除く)を使用してそこからストレージを割り当てます。必要に応じて大きくなり、不足するとOutOfMemoryExceptionが発生します。

  • ローダーヒープ。AppDomainに対して静的なものはすべて、そこに格納されます。小さな部分はたくさんありますが、重要なのは、静的変数、型情報(リフレクションで取得する種類)、およびジャストインタイムでコンパイルされたコードのストレージです。それは必要に応じて成長し、使いすぎると非常に困難になります。

  • スタック。プロセッサのコアデータ構造。C#で抽象化しないことは、C#が高速なプログラムを作成する重要な理由です。スタックには、メソッドを呼び出すときのリターンアドレス、メソッドに渡される引数、およびメソッドのローカル変数が格納されます。デフォルトでは、スタックは1メガバイトであり、拡張できません。このサイトの名前を使いすぎると、プログラムは失敗します。プロセッサがコードの実行を続行できないため、失敗を診断するのは非常に困難です。

スレッドは、最後の1つにひねりを加えて、これらすべてのメモリカテゴリを確認します。すべてのスレッドには独自のスタックがあります。これが、他のスレッドから独立して独自のメソッドを実行できる理由です。ただし、他のスレッドとまったく同じコードを使用し、ローダーヒープは共有されます。複数のスレッドが同じメソッドを実行すると仮定します。また、ガベージコレクションされた同じヒープ変数と静的変数を共有します。これにより、スレッドコードの記述が難しくなります。スレッドが、他のスレッドでも使用されているオブジェクトや静的変数を踏まないようにする必要があります。lockキーワードの重要な理由。

于 2012-10-14T09:22:06.020 に答える
3

いいえ、各スレッドには独自のスタックがあります。そして、DoSomethingは1つだけです。そして、各スレッドは、安全に別の質問であるかどうかにかかわらず、どこからでもあらゆる種類のデータにアクセスできます。DoSomethingは単なるデータ、整数であり、各スレッドがそれをインクリメントするものと考えてください。ここで、DoSomethingが関数ポインターであり、そのアドレス(本質的にはint)を各スレッドに渡すと想像してください。

于 2012-10-14T06:43:02.680 に答える
0

あなたの質問に答えるために、いいえ、メモリ内にメソッドの複数のコピーはありません。コピーは1つだけで、複数のスレッドが実行されます。メモリ内のオブジェクトでさえ、複数のスレッド間で共有されます。それがメモリの破損につながるものです。

スレッドについてもう少しよく理解するためにこれを通過してください。

編集:また、ここで同様の質問。

于 2012-10-14T08:19:13.487 に答える