gpt4 book ai didi

c# - 使用相同方法的并发线程

转载 作者:行者123 更新时间:2023-11-30 13:48:21 25 4
gpt4 key购买 nike

如果我生成多个线程,并告诉它们都使用相同的方法:

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 在内存中制作了该方法的不同副本?

最佳答案

does that mean that the CLR makes different copies of the method in memory?

没有。它有助于理解内存在 .NET 程序中是如何分区的。我将跳过很多次要的实现细节来绘制大图。您可以将内存分割为以下类别:

  • 垃圾收集堆。对象存储在那里,您可以使用 new 运算符从中分配存储空间(结构除外)。它会根据需要增长,用完会产生 OutOfMemoryException。

  • 加载程序堆。 AppDomain 的任何静态内容都存储在那里。很多小块,但重要的是静态变量的存储、类型信息(你用反射检索的那种)和即时编译代码。它会根据需要增长,使用太多很难做到。

  • 堆栈。处理器的核心数据结构。在C#中没有将其抽象掉是C#产生快速程序的一个重要原因。栈中存放的是调用方法时的返回地址、传递给方法的参数和方法的局部变量。默认情况下,堆栈为 1 兆字节并且不能增长。如果您使用该站点名称过多,您的程序将失败,这是一种严重且难以诊断的故障,因为处理器无法继续执行代码。

线程会看到所有这些内存类别,最后一个有所不同。每个线程都有自己的堆栈。这就是为什么它能够独立于其他线程运行自己的方法的原因。然而,它使用与任何其他线程完全相同的代码,加载程序堆是共享的。假设不止一个线程执行同一个方法。它共享相同的垃圾收集堆和静态变量。这使得编写线程代码变得困难,您必须确保线程不会踩到其他线程也使用的对象和静态变量。 lock 关键字的重要原因。

关于c# - 使用相同方法的并发线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12879897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com