【发布时间】:2019-01-18 10:01:04
【问题描述】:
平台:Linux 上的 DotNet Core 2
C# 指针解引用是否易失或如何使其易失?
我们的团队正在研究一些需要超低延迟但仍需要用 C# 编写的疯狂东西。我们需要以尽可能低的延迟从共享内存中获取价值,我们将忙于等待。 因此,对共享内存的指针引用是我可以想象的最快方式。但真正担心 JIT 会尝试缓存该值。
我认为 Volatile.Read(IntPtr) 可能会完成这项工作,但似乎 IntPtr 是一个不可变对象,因此如果我们继续分配新对象,应用程序将创建大量垃圾。
感谢@Eric 指出这不会造成垃圾。但我的问题仍然存在。 Volatile.Read(IntPtr) 是否可以完成这项工作?由于 IntPtr 不是 volatile,但它指向的值是。
还有没有机会在指针上使用比较和交换功能?
unsafe
{
var access = MemoryMappedFile.CreateFromFile("Test.mem");
IntPtr ptr = access.SafeMemoryMappedFileHandle.DangerousGetHandle();
int* p = (int*)ptr.ToPointer();
p++; //How to get value of this p, if the memory will be updated by another process.
}
【问题讨论】:
-
尝试使用
var something = &p; -
谢谢。但是 *something 是否会被缓存? @preciousbetine
-
*something将指向 p 指向的同一事物。因此,如果您执行var somethingelse = &something之类的操作,您仍然会得到 p 的值 -
C# 不允许您声明“指向 volatile 的指针”这一事实似乎表明由于 C# 内存模型而不需要它,但这可能只是一厢情愿。您可以尝试在尊重之前致电
Thread.MemoryBarrier(),但是(继续...) -
我也很困惑,为什么您要问是否可以在取消引用的指针上进行互锁比较和交换。你当然可以。你能说为什么你认为这可能是不可能的吗?同样,您可能有一个需要纠正的错误信念。 这是严肃的事情;你真的,真的必须把这段代码弄对。非托管多线程低锁代码是在 C# 中最难纠正的代码。你所有的推理和信念都必须是正确的。
标签: c# .net-core volatile unsafe