Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对.net中的MemoryMappedFile使用x64联锁操作_C#_.net_Multithreading_Memory Mapped Files_Interlocked - Fatal编程技术网

C# 如何对.net中的MemoryMappedFile使用x64联锁操作

C# 如何对.net中的MemoryMappedFile使用x64联锁操作,c#,.net,multithreading,memory-mapped-files,interlocked,C#,.net,Multithreading,Memory Mapped Files,Interlocked,我需要对.NET中的MemoryMappedFiles中的内存使用互锁操作(比较交换、增量等) 我发现这是一个非常相似的问题。问题是联锁操作不能从64位操作系统上的内核32(或任何其他)dll导出(参见示例) 在64位.NET进程中,有没有其他方法可以调用内存块上的互锁函数 编写一个小型C++/CLI帮助程序库,提供托管代码可使用的互锁操作 我相信最快的互操作路径是公开一个托管类,该类在内部调用一个非托管函数,该函数本身在互锁的内部函数上使用。这样,您甚至不必通过PInvoke。我会尝试编写自己

我需要对.NET中的
MemoryMappedFile
s中的内存使用互锁操作(比较交换、增量等)

我发现这是一个非常相似的问题。问题是联锁操作不能从64位操作系统上的内核32(或任何其他)dll导出(参见示例)


在64位.NET进程中,有没有其他方法可以调用内存块上的互锁函数

编写一个小型C++/CLI帮助程序库,提供托管代码可使用的互锁操作


我相信最快的互操作路径是公开一个托管类,该类在内部调用一个非托管函数,该函数本身在互锁的内部函数上使用。这样,您甚至不必通过PInvoke。

我会尝试编写自己的C Dll,其中导出的函数调用互锁函数,然后从.NET中PInvoke。@AlexFarber Excellent point!我只是想问一下:)你知道我是否可以很容易地找到编译器内部互锁函数(例如)的ASM实现?这样我就不必自己重新设计ASM代码了。您不需要这样做,只需从本机Dll调用所需的函数,编译器就会完成其余的工作。我的意思是,对于您需要的每个互锁函数,编写调用互锁函数的导出Dll函数。使用这种原子访问函数的目的是将其内联,这样开销绝对最小。一旦你不得不pinvoke,那么这一点就完全失去了,避免命名的同步对象就没有意义了。@HansPassant在我的例子中,我与数百个长值共享一个内存缓冲区。为了避免争用,我需要数百个同步对象(互斥对象等)。此外,我还希望在那些强制通过内存缓存线推送新值时实现互锁(与具有非特定定时的内存屏障相反)-但您是对的,P/Invoke可能会完全破坏这一优势:|不幸的是,这不是真的-C++/CLI在抑制检查的情况下比P/Invoke慢-请参见,例如,此处:或此处:因此P/Invoke是一种可行的方法(不幸的是,每次调用仍会显示十几条指令)第一篇文章似乎表明C++包装器更快。在第二篇文章中,C++包装器速度太慢,我开始怀疑。可能没有优化或执行额外的工作(实际上,C++包装器只通过中间类调用Sqrt。为什么?)。在这两篇文章中,基准时间都非常小。噪音很大。日期时间。现在也不是很精确。通常,它以15毫秒的步长递增。他的测试范围是10-30毫秒。我不相信这两篇文章,我不会花时间去调查更多。我同意你的发现。主要的一点是,如果您想要最大的速度,您需要超越所有与managednative转换相关的堆栈跟踪探测等。使用P/Invokes,您可以通过指定SuppressUnmanagedCodeSecurity属性来实现这一点。使用C++/CLI包装器,默认情况下,您将获得所有这些检查,据我所知,您无法设置它们的快捷方式。