1
14
我们不要在这里埋怨别人:你的问题的答案是 不,在clr 2.0内存模型中永远不会看到内存的预分配状态 是的。 我现在谈谈你的几个非中心观点。
这或多或少是正确的。有一些机制可以在不使用
同样,这或多或少是正确的。一个更好的思考方法是C允许重新排序 在单线程程序看不到重新排序的任何点上 ,受某些限制。这些约束包括在某些情况下引入获取和释放语义,以及在某些关键点上保留某些副作用。
已故伟大的克里斯的文章是瑰宝,给了我们很多关于clr早期的见解,但我注意到,自从2003年那篇文章被写出来以来,内存模型已经有了一些增强,特别是关于你提出的问题。 克里斯是对的,双重检查锁是超级危险的。有一种正确的方法可以在C中执行双重检查锁定,并且 瞬间 你甚至离开它 轻微地 ,您将陷入只在弱内存模型硬件上重新编程的可怕错误的杂草中。
我认为你的问题并不是关于chris所描述的旧的弱ecma内存模型,而是关于今天实际做了什么保证。 重新排序不可能公开对象的以前状态 . 当您读取一个新分配的对象时,它的字段都是零。 这是因为所有写操作在当前内存模型中都具有释放语义;有关详细信息,请参见: http://joeduffyblog.com/2007/11/10/clr-20-memory-model/ 将内存初始化为零的写入将不会在以后的读取中及时向前移动。
乔在这里讨论: http://joeduffyblog.com/2010/06/27/on-partiallyconstructed-objects/ 这里的问题不是我们可能看到对象的预分配状态。相反,这里关心的是一个线程可能会看到一个对象 当构造函数仍在另一个线程上运行时 是的。 事实上, 构造器 以及 终结器 跑步 同时 ,太奇怪了!由于这个原因,终结器很难正确编写。 换一种说法: clr保证它自己的不变量将被保留 是的。CLR的一个不变量是观察到新分配的内存被调零,这样不变量将被保留。
但CLR不是为了保护
你的
不变量!如果您有一个保证该字段的构造函数
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
i_sniff_ket · 在unity之外使用unity类 2 年前 |