gpt4 book ai didi

c# - MemoryMappedFile 不适用于 2 个进程?

转载 作者:行者123 更新时间:2023-11-30 20:06:26 28 4
gpt4 key购买 nike

我用 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();
}

结果是:

enter image description here

胡?

“1”、“2”在哪里?

但是,如果我运行第一个进程(不激活进程 B),我得到:

enter image description here

我错过了什么?

我希望看到:

Process A says: 1
Process B says: 2

最佳答案

您正在与 BinaryWriter.Write(string) 的实现细节作斗争。它首先写入字符串的长度,以便 BinaryReader 在读回字符串时知道需要读取多少个字符。对于短字符串,如“1”,它写入一个字节来存储长度。

所以你传递给 CreateViewStream() 的偏移量是错误的,传递 1 将使其覆盖进程 A 写入的字符串的一部分。你看到的笑脸字符是 (char)1 的字形.进程B写入的字符串的长度字节。

内存映射文件在托管代码中很麻烦。您通常通过声明一个结构来设置布局并使用指针访问 View 来读写它们,但这需要不安全的代码。流对于一大块内存来说是一个非常糟糕的抽象,但却是一个必要的邪恶。这也是 MMF 花了这么长时间才在 .NET 中可用的原因。

关于c# - MemoryMappedFile 不适用于 2 个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9760073/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com