【问题标题】:newobj instruction from CLR来自 CLR 的 newobj 指令
【发布时间】:2012-02-12 18:45:35
【问题描述】:

Andrew Troelsen 在他的书 Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition 中解释 来自 CLR 的 newobj 指令 页号。 248,第一段第三子弹

在将引用返回给调用者之前,前进下一个对象指针以指向托管堆上的下一个可用槽

听起来推进下一个对象指针lock 块(或类似的东西)内,以确保在所有.net 线程在托管堆上创建每个对象后正确递增该指针。我是对的还是完全错的?

【问题讨论】:

  • 是的,函数名是“EnterAllocLock”。您可以在 CLR 的 SSCLI20 版本,clr/src/vm/gcsmp.cpp 源代码文件中看到它的可能实现。它有一个不寻常的优化,我不想解释。

标签: .net garbage-collection


【解决方案1】:

首先这是一个实现细节。有很多方法可以实现这一点,CLR 实现可以随意选择。

几种可能的实现方式:

  1. 按照您的建议使用锁定
  2. 使用“无锁”方法,例如Interlocked.Exchange
  3. 从每个线程的不同区域分配。例如,每个线程有一个单独的 Gen0 堆。

【讨论】:

  • implementation detail,听起来只有 CLR 团队 可以发布确切的答案。
  • 不,关键是这无关紧要,你不能假设任何特定的实现。没有一个“CLR 团队”。 Microsoft 有一个团队致力于他们的 CLR,但他们并不是镇上唯一的游戏。
  • intertech.com/Instructors/Default.aspx?InstructorID=1 Andrew 是 Microsoft MVP,这意味着他可能对确切的源代码具有只读访问权限,microsoft.com/presspass/press/2003/oct03/10-22MVPSLP2003PR.mspx 我猜在这一段中他无意中写了太多关于你的实现细节作为开发人员永远不应该关心。就像@CodyGray 指出的那样,确实还有其他 CLR 实现,例如 Mono,因此您不应假设所有此类克隆都使用相同的方法。
猜你喜欢
  • 2010-10-21
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
相关资源
最近更新 更多