指针的C#(DotNet内核)易失性读/写

指针的C#(DotNet内核)易失性读/写,c#,.net-core,volatile,unsafe,C#,.net Core,Volatile,Unsafe,平台:Linux上的DotnetCore2 C#指针解引用是易变的还是如何使其易变 我们的团队正在研究一些需要超低延迟但仍需要用C#编写的疯狂东西。我们需要从共享内存中获得尽可能低的延迟值,我们将忙于等待。 因此,指向共享内存的指针引用是我能够想象的最快的方式。但真正关心JIT的人会试图缓存该值 我认为Volatile.Read(IntPtr)可以完成这项工作,但IntPtr似乎是一个不可变的对象,因此如果我们继续分配新的垃圾,应用程序将创建大量垃圾。 谢谢@Eric指出这不是在制造垃圾。但

平台:Linux上的DotnetCore2

C#指针解引用是易变的还是如何使其易变

我们的团队正在研究一些需要超低延迟但仍需要用C#编写的疯狂东西。我们需要从共享内存中获得尽可能低的延迟值,我们将忙于等待。 因此,指向共享内存的指针引用是我能够想象的最快的方式。但真正关心JIT的人会试图缓存该值

我认为Volatile.Read(IntPtr)可以完成这项工作,但IntPtr似乎是一个不可变的对象,因此如果我们继续分配新的垃圾,应用程序将创建大量垃圾。

谢谢@Eric指出这不是在制造垃圾。但我的问题仍然存在。Volatile.Read(IntPtr)是否执行此任务?因为IntPtr不是易失性的,但是它指向的值是易失性的

还有,我可以在指针上使用比较和交换功能吗

 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.

        }


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

尝试使用
var something=&p谢谢。但是,某些东西是否会被缓存@preciousbetine
*有些东西
会指向p指向的同一个东西。因此,如果你做一些像
var somethingelse=&something
这样的事情,你仍然会得到p的值。C不允许你声明“指向volatile的指针”这一事实似乎表明,由于C内存模型,它是不需要的,但这可能只是一厢情愿。您可以在遵从之前尝试调用
Thread.MemoryBarrier()
,但是(续…)我也不明白为什么您会问是否可以对取消引用的指针执行联锁比较和交换。你当然可以。你能说说为什么你认为这是不可能的吗?同样,你可能有一个需要纠正的错误信念。这是严肃的事情;你真的,真的必须把代码弄好。非托管多线程低锁代码是C#中最难更正的代码。你所有的推理和信念都必须是正确的。
Volatile.Read(ref *p);