如何在C#中使用共享内存功能的MemoryMappedViewAccessor
How to use MemoryMappedViewAccessor of shared memory function in C#
我参考了msdn share memory
并找到 CreateViewStream,现在我要创建 int
在内存中使用 MemoryMappedViewAccessor
// Process A:
static void Main(string[] args)
{
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);
writer.Write(1);
}
mutex.ReleaseMutex();
// Read Int
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
// For Process B Read
accessor.Write(499, 41);
// For Process B Read
accessor.Write(500, 42);
// For Process C Read
accessor.Write(501, 43);
accessor.Dispose();
Console.WriteLine("Start Process B and press ENTER to continue.");
Console.ReadLine();
Console.WriteLine("Start Process C and press ENTER to continue.");
Console.ReadLine();
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
MemoryMappedViewAccessor access = mmf.CreateViewAccessor();
Console.WriteLine("Process A says: {0} ", reader.ReadBoolean());
Console.WriteLine("Process B says: {0} ", reader.ReadBoolean());
Console.WriteLine("Process C says: {0} ", reader.ReadBoolean());
Console.WriteLine("Process A Int:{0}", access.ReadInt32(499));
Console.WriteLine("Process B Int:{0}", access.ReadInt32(500));
Console.WriteLine("Process C Int:{0}", access.ReadInt32(501));
access.Dispose();
}
mutex.ReleaseMutex();
mmf.Dispose();
}
Console.Read();
}
但是结果如下
Process A says: True
Process B says: False
Process C says: False
Process A Int:2828841
Process B Int:11050
Process C Int:43
谁能告诉我问题所在?
为什么结果流程A、B
不是 41 和 42
更改此代码
// For Process B Read
accessor.Write(499, 41);
// For Process B Read
accessor.Write(503, 42);
// For Process C Read
accessor.Write(507, 43);
Console.WriteLine("Process A Int:{0}", access.ReadInt32(499));
Console.WriteLine("Process B Int:{0}", access.ReadInt32(503));
Console.WriteLine("Process C Int:{0}", access.ReadInt32(507));
那么结果就是
进程A Int:41
进程 B Int:42
进程 C Int:43
或更改此代码
Console.WriteLine("Process A Int:{0}", access.ReadByte(499));
Console.WriteLine("Process B Int:{0}", access.ReadByte(500));
Console.WriteLine("Process C Int:{0}", access.ReadByte(501));
结果相同
感谢@Hans Passant
我参考了msdn share memory
并找到 CreateViewStream,现在我要创建 int
在内存中使用 MemoryMappedViewAccessor
// Process A:
static void Main(string[] args)
{
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);
writer.Write(1);
}
mutex.ReleaseMutex();
// Read Int
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
// For Process B Read
accessor.Write(499, 41);
// For Process B Read
accessor.Write(500, 42);
// For Process C Read
accessor.Write(501, 43);
accessor.Dispose();
Console.WriteLine("Start Process B and press ENTER to continue.");
Console.ReadLine();
Console.WriteLine("Start Process C and press ENTER to continue.");
Console.ReadLine();
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
MemoryMappedViewAccessor access = mmf.CreateViewAccessor();
Console.WriteLine("Process A says: {0} ", reader.ReadBoolean());
Console.WriteLine("Process B says: {0} ", reader.ReadBoolean());
Console.WriteLine("Process C says: {0} ", reader.ReadBoolean());
Console.WriteLine("Process A Int:{0}", access.ReadInt32(499));
Console.WriteLine("Process B Int:{0}", access.ReadInt32(500));
Console.WriteLine("Process C Int:{0}", access.ReadInt32(501));
access.Dispose();
}
mutex.ReleaseMutex();
mmf.Dispose();
}
Console.Read();
}
但是结果如下
Process A says: True Process B says: False Process C says: False Process A Int:2828841 Process B Int:11050 Process C Int:43
谁能告诉我问题所在?
为什么结果流程A、B
不是 41 和 42
更改此代码
// For Process B Read
accessor.Write(499, 41);
// For Process B Read
accessor.Write(503, 42);
// For Process C Read
accessor.Write(507, 43);
Console.WriteLine("Process A Int:{0}", access.ReadInt32(499));
Console.WriteLine("Process B Int:{0}", access.ReadInt32(503));
Console.WriteLine("Process C Int:{0}", access.ReadInt32(507));
那么结果就是
进程A Int:41 进程 B Int:42 进程 C Int:43
或更改此代码
Console.WriteLine("Process A Int:{0}", access.ReadByte(499));
Console.WriteLine("Process B Int:{0}", access.ReadByte(500));
Console.WriteLine("Process C Int:{0}", access.ReadByte(501));
结果相同
感谢@Hans Passant