共享内存 ---进程间通讯 解决死锁和数据损坏的问题 同时可以解决数据不同步的问题
using System;
using System.IO.MemoryMappedFiles;
using System.Text;
using System.Threading;
class WriteProcess
{
static void Main()
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("my_shared_memory", 1024))
{
using (var accessor = mmf.CreateViewAccessor())
{
// 写入操作加锁
Mutex mutex = new Mutex(true, "SharedMemoryMutex");
mutex.WaitOne();
string message = "Hello, shared memory!";
byte[] buffer = Encoding.ASCII.GetBytes(message);
accessor.WriteArray(0, buffer, 0, buffer.Length);
// 添加同步信号量,通知读取进程数据已更新
Semaphore semaphore = Semaphore.OpenExisting("SharedMemorySemaphore");
semaphore.Release();
mutex.ReleaseMutex();
}
}
}
}
using System;
using System.IO.MemoryMappedFiles;
using System.Text;
using System.Threading;
class ReadProcess
{
static void Main()
{
// 创建同步信号量
Semaphore semaphore = new Semaphore(0, 1, "SharedMemorySemaphore");
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("my_shared_memory", 1024))
{
using (var accessor = mmf.CreateViewAccessor())
{
while (true)
{
// 等待写入进程发出的同步信号
semaphore.WaitOne();
// 读取操作加锁
Mutex mutex = new Mutex(true, "SharedMemoryMutex");
mutex.WaitOne();
byte[] readBuffer = new byte[1024];
accessor.ReadArray(0, readBuffer, 0, readBuffer.Length);
string readMessage = Encoding.ASCII.GetString(readBuffer).TrimEnd('\0');
Console.WriteLine(readMessage);
mutex.ReleaseMutex();
}
}
}
}
}
在以上代码中,我们分别创建了一个写入进程和一个读取进程,它们共享同一个名为“my_shared_memory”的内存映射文件。
写入进程首先打开这个内存映射文件,然后获取其中的ViewAccessor,并使用WriteArray方法将数据写入到共享内存中。写入操作加锁,使用Mutex.WaitOne()方法获取锁,然后进行操作,最后使用Mutex.ReleaseMutex()释放锁。
写入进程还通过创建一个同步信号量Semaphore来通知读取进程数据已经更新。在写入操作完成后,通过Semaphore.Release()方法释放信号量。
读取进程首先创建一个同步信号量Semaphore,并设置初始计数为0。然后打开同样的内存映射文件,获取ViewAccessor并使用ReadArray方法从共享内存中读取数据。读取操作加锁,使用Mutex.WaitOne()方法获取锁,然后进行操作,最后使用Mutex.ReleaseMutex()释放锁。
读取进程在一个无限循环中等待写入进程发出的信号量,一旦收到信号量,就进入临界区执行读取操作。
通过使用同步信号量的方式,写入进程在写入操作完成后通知读取进程,读取进程收到通知后再进行读取操作,从而解决了共享内存数据不同步的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具