【问题标题】:C# Local heaps for threads in multithread process多线程进程中线程的 C# 本地堆
【发布时间】:2013-06-11 16:05:08
【问题描述】:

我在 C# 中有一个多线程进程,每个线程都经常尝试从堆中分配内存。这需要多个堆的锁,因此降低了线程的优势。

是否存在类似于线程的本地堆的东西,以便同时尝试从不同线程分配内存不会锁定其中一个?

【问题讨论】:

  • 您确定争用是由于堆分配造成的吗?顺便提个有趣的问题...
  • 这是最有可能的变种..
  • 如果你产生了很多线程,这可能是其本身的原因,与他们所做的无关。在任何给定时间运行多少线程?
  • 即使线程数是5-10也会出现这个问题
  • 我不确定它是否在单个堆中的线程之间释放了锁。但是,垃圾收集器具有Server 模式,其中每个处理器都有单独的堆。

标签: c# multithreading heap-memory


【解决方案1】:

根据this article,当多个线程同时分配内存时,多处理器系统中不存在争用:

无同步分配 在多处理器系统上, 托管堆的第 0 代被拆分为多个内存区域 每个线程使用一个竞技场。这允许多个线程进行 同时分配,以便对堆的独占访问不是 必填。

编辑:Hans Passant 已正确指出,为了应用此行为,垃圾收集器必须在工作站环境中强制为 gcServer 模式。 这是通过编辑 app.configweb.config 文件并确保定义了以下设置来完成的:

<configuration> 
    <runtime> 
        <gcServer enabled="true"/> 
    </runtime> 
    ...
</configuration> 

【讨论】:

  • 您在此答案中缺少重要部分。执行此操作的 GC 模式仅在服务器类机器上自动启用。它必须在工作站上强制执行。记录 &lt;gcServer&gt; 元素以清除它。
  • 非常感谢汉斯。我不知道这个要求
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多