c# – 如何并行处理内存映射文件中的数据

前端之家收集整理的这篇文章主要介绍了c# – 如何并行处理内存映射文件中的数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
作为内存映射文件名称,我明白,使用C#中的类MemoryMappedFile可以将大文件的一部分映射到内存,以进行快速数据处理.我想要使​​用内存映射文件来并行处理内存映射.为了做到这一点,我有以下问题

MemoryMappedFileViewAccessor是线程安全的和Parallel.For-safe?我实际上做了一个演示程序来测试这个问题,似乎是有效的.但是找不到任何关于这个的参考.如果答案是肯定的,我已经完成了.除此以外,
有没有办法直接访问与数组映射的内存?我知道MemoryMappedFileViewAccessor有ReadArray方法,但使用的方法是内存的重复.

解决方法

你可以理解这一点.内存映射文件只是程序中的一大块内存,其字节可由多个进程访问.它们在托管代码中非常尴尬,因为该块存在于特定地址.这需要使用指针访问数据,它们在托管代码中是禁忌的. MemoryMappedFileViewAccessor包装该指针,它将数据从托管内存复制到共享内存.请注意,这不符合使用MMF的主要原因,以及为什么他们的支持花费了很长时间才能在.NET中显示出来.确保您不想使用命名管道.

所以推理这一点,MMF当然不是线程安全的设计,因为这是共享内存,就像全局变量在你的代码.如果线程读取和写入共享内存的同一部分,事情就会出错.而且你必须保护完全一样,一个锁,以确保只有一个线程可以访问共享部分.

还要注意,您需要在读取和写入MMF的进程之间实现该锁定.这往往很痛苦,您必须使用“主”进程创建的命名互斥体,并打开“从”进程.你不能吝啬那个锁定的要求.值得注意的是,你从来没有提到在你的问题上照顾这个,所以红旗那里.

在一个进程中,不访问MMF的同一部分的线程不能彼此相处.就像访问不同变量的两个线程不需要任何同步.只要它们持有互斥体,确保另一个进程不能写入该部分.请注意,这可能意味着您要使用信号量来保护MMF访问,只能通过一个线程获取Mutex.

猜你在找的C#相关文章