【发布时间】:2012-04-03 08:13:00
【问题描述】:
我用MemoryMappedFile 做了一个简单的测试,msdn 说:
2 个进程,1 个内存映射文件:
- 第一个进程添加字符串“1”
- 第一个进程等待
- 第二个进程添加字符串“2”并终止
- 第一个进程现在读取整个内存映射文件
流程A:
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
{
bool mutexCreated;
Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);
writer.Write("1");
}
mutex.ReleaseMutex();
Console.WriteLine("Start Process B and press ENTER to continue.");
Console.ReadLine();
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream, Encoding.UTF8);
Console.WriteLine("Process A says: {0}", reader.ReadString());
Console.WriteLine("Process B says: {0}", reader.ReadString());
}
mutex.ReleaseMutex();
}
流程 B:
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
{
Mutex mutex = Mutex.OpenExisting("testmapmutex");
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0))
{
BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);
writer.Write("2");
}
mutex.ReleaseMutex();
}
结果是:
胡?
“1”、“2”在哪里?
但是,如果我运行 ONLY 第一个进程(不激活进程 B),我会得到:
我错过了什么?
我希望看到:
Process A says: 1
Process B says: 2
【问题讨论】:
-
在 MSDN 的示例中,他们写数字,你写字符串。传递给 CreateViewStream 的偏移量可能是错误的!这将解释 BinaryReader 返回的垃圾
-
@Steve 他们没有考虑任何偏移量...我只是将 bool 更改为 string..
-
但是,如果内存服务,UTF8 是两个字节,您从第 1 个字节开始写入第二个字符串,覆盖第一个字符串的第二个字节。
-
@steve utf8 中的 8 是每个字符的位数
标签: c# .net-4.0 memory-mapped-files