MemoryMappedFile等待句柄和互斥

时间:2018-01-31 14:36:22

标签: c#

有没有办法从WaitHandle获取MemoryMappedFile?分配的名称似乎与尝试使用相同名称获取或创建互斥锁相冲突。

const string name = "tobyd";
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(name, 64);
Mutex mx = new Mutex(true, name); // bang! sadness.

如果我使用Mutex.TryOpenExisting静态,我会返回false并在out参数中为null。毫不奇怪。

MemoryMappedFile中的内容正在耗尽此引用名称?您如何等待MMF发布才能重新使用该名称?

1 个答案:

答案 0 :(得分:0)

简化的内存映射文件是一种操作系统结构,用于将文件映射到虚拟内存,而无需从磁盘读取整个文件。

相反,它正在访问内存中的实际介质(HDD,SSD,NAS等)。 这是一个跨进程的构造,以确保不超过一个实例(进程/线程)同时向其写入某种锁。

我不知道我会认为Windows正在使用带有mapName(文件名)的Mutex解决此问题。

Further reading (Wikipedia)

修改

反编译类MemoryMappedFile时,您会注意到它正在使用Windows kernel32函数CreateFileMapping,该函数指出:

  

如果lpName与现有事件,信号量,互斥量,可等待计时器或作业对象的名称匹配,则该函数将失败,并且GetLastError函数将返回ERROR_INVALID_HANDLE。发生这种情况是因为这些对象共享相同的名称空间。

静态方法MemoryMappedFile.CreatOrOpen中的参数mapName将在调用CreateFileMapping中传递给lpName

如果该语句为true,则此代码也会失败:

const string name = "tobyd";
Mutex mx = new Mutex(true, name);
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(name, 64); // bang! sadness.

有鉴于此,我认为我最初的假设是正确的。