【发布时间】:2016-08-05 11:32:29
【问题描述】:
我们都知道诸如 Task.Run 或 Parallel.ForEach 之类的方法。 它们中的每一个都创建根据选项在单独的线程中或在线程池中的线程中运行的任务。但是,他们的堆栈在哪里?在某个代堆中还是有专门的地方供他们使用?
例如,我可以创建 1000 个任务,它们的堆栈在哪里?如果我调用 GC.Collect(),他们的物理地址会在某个时候移动吗?
【问题讨论】:
-
这对于特定的 CLR 实现、底层操作系统甚至 CPU 架构来说都是非常具体的。例如,Windows 对分配(和增长)线程堆栈有特定的支持,这与 x86/x64 内存管理的工作方式一致。
-
确实如此。 C# 语言中几乎没有要求存在任何堆栈(实际上只是堆栈分配 - 在 C# 语言规范中只有 44 次出现
stack,其中一半是名为Stack的示例类)
标签: c# multithreading