【发布时间】:2012-05-26 23:45:56
【问题描述】:
所以我知道interior_ptr<typename> 可用于操作结构数组,与使用fixed 语句在C♯ 中完全相同,但它不会修复堆上的数组并让垃圾收集移动它。这很好,因为我不想妨碍垃圾收集器有效工作。但是,垃圾收集器在单独的线程上运行,当它处于活动状态时,所有其他线程都会停止,而堆上的对象会被压缩。
假设我有以下代码:
interior_ptr<unsigned char> sourceBufferPtr = reinterpret_cast<interior_ptr<unsigned char>>(&sourceBuffer[0]) + sourceOffset;
代码应该像这样运行,例如:
-
&sourceBuffer[0]返回数组中第一项的地址:32。 -
sourceOffset: 8. -
reinterpret_cast<interior_ptr<unsigned char>>(&sourceBuffer[0])将地址转换为interior_ptr<unsigned char>,然后添加到sourceOffset。 -
sourceBufferPtr应该等于……- 如果垃圾收集器没有移动数组,则为 40。
- 如果垃圾收集器将数组移动到 16 之类的位置,则为 24。
- 如果垃圾收集器在第 3 步和第 4 步之间移动了数组,则数组的位置将在第 3 步之后更新为 16,但分配给
sourceBufferPtr的结果仍为 40。
我是否正确假设垃圾收集器可以在步骤 3 和 4 之间停止线程并可能将错误的值分配给 sourceBufferPtr 或者公共语言运行时以某种方式知道如何确保整个语句是原子/值是否正确?使用interior_ptr<typename> 做什么是安全的?
【问题讨论】:
标签: .net pointers garbage-collection thread-safety c++-cli