Bru*_*tos 3 c# stack multithreading
如果我生成各种线程,并告诉他们所有使用相同的方法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
所有线程都会共享相同的堆栈吗?当我运行程序时,所有线程都返回1,所以我猜答案是否定的,但这是否意味着CLR在内存中制作了不同的方法副本?
这是否意味着CLR在内存中制作了不同的方法副本?
不.它有助于了解内存在.NET程序中的分区方式.我将跳过很多次要的实现细节来绘制大图.您可以在以下类别中细分内存:
垃圾收集堆.对象存储在那里,您使用new运算符(结构除外)从中分配存储.它会根据需要增长,用完它会产生OutOfMemoryException.
加载器堆.AppDomain的任何静态内容都存储在那里.很多小块但重要的是存储静态变量,类型信息(用反射检索的那种)和即时编译代码.它会根据需要增长,使用太多它是非常困难的.
堆栈.处理器的核心数据结构.不用C#抽象它是C#生成快速程序的一个重要原因.调用方法时,堆栈存储返回地址,传递给方法的参数和方法的局部变量.默认情况下,堆栈是一兆字节,无法增长.如果您使用过多的程序,那么您的程序将失败并显示此站点的名称,因为处理器无法继续执行代码而导致严重且难以诊断失败.
一个线程看到所有这些内存类别,最后一个扭曲.每个线程都有自己的堆栈.这就是为什么它能够独立于其他线程运行自己的方法.然而,它使用与任何其他线程完全相同的代码,共享加载器堆.假设多个线程执行相同的方法.它共享相同的垃圾收集堆和静态变量.这使得编写线程代码变得困难,您必须确保线程不会踩到其他线程也使用的对象和静态变量.lock关键字的一个重要原因.