Ric*_*ard 25 c# multithreading
我正在研究内存模型,并且正在努力了解一个进程中存在多少堆.
因此,如果我们有一个包含5个线程的进程,我是否正确地说我们有5个堆栈和1个堆?
如果是这样,线程可以访问彼此的堆栈(或者这正是为什么它们有单独的堆栈,以防止损坏),如果只有1个堆,那么显然它们都访问这个堆,因此需要锁定多个线程?我理解正确吗?
Han*_*ant 38
是的,每个线程都有自己的堆栈.这是一个非常必要的事情,堆栈会跟踪方法在完成后返回的位置,它会存储返回地址.由于每个线程都执行自己的代码,因此它们需要自己的堆栈.局部变量和方法参数也存储在那里,使它们(通常)是线程安全的.
堆的数量是一个更复杂的细节.您为垃圾收集堆计数1.从实现的角度来看,这并不完全正确,三代堆加上大对象堆在逻辑上是不同的堆,最多可添加四个堆.当您分配太多时,此实现细节开始变得重要.
另一个在托管代码中无法完全忽略的是存储静态变量的堆.它与AppDomain相关联,只要AppDomain存在,静态变量就会生效.在.NET文献中通常称为"加载器堆".它实际上由3个堆(高频,低频和存根堆)组成,jitted代码和类型数据也存储在那里,但这已经达到了实质.
忽略列表的下方是本机代码使用的堆.其中两个在元帅级别中很容易看到.有一个默认进程堆,Windows从中分配,Marshal.AllocHGlobal()也是如此.并且有一个单独的堆,其中COM存储数据,Marshal.AllocCoTaskMem()从中分配.最后,您互操作的任何本机代码都有自己的堆用于运行时支持.这种代码使用的堆数仅受加载到进程中的本机DLL数量的限制.所有这些堆都存在,你几乎没有直接处理它们.
所以,最少10个堆.
Jak*_*cki 12
简而言之,是的.
进程中的所有线程共享同一个堆,因此它们可以交换数据.每个线程都有自己的堆栈,它与该线程上的当前代码执行有关.
这里有一个非常好的线程资源:http://www.albahari.com/threading/
线程类似于运行应用程序的操作系统进程.正如进程在计算机上并行运行一样,线程在单个进程中并行运行.流程彼此完全隔离; 线程只有有限的隔离程度.特别是,线程与在同一应用程序中运行的其他线程共享(堆)内存.这部分是为什么线程有用的原因:例如,一个线程可以在后台获取数据,而另一个线程可以在数据到达时显示数据.