【问题标题】:volatile Read/Write in C#(DotNet Core) for pointersC#(DotNet Core) 中用于指针的 volatile 读/写
【发布时间】: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


【解决方案1】:
Volatile.Read(ref *p);

An example

但您必须保证地址是 4 字节对齐的。否则读取将不是原子的。

【讨论】:

    最近更新 更多