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()释放锁。
读取进程在一个无限循环中等待写入进程发出的信号量,一旦收到信号量,就进入临界区执行读取操作。
通过使用同步信号量的方式,写入进程在写入操作完成后通知读取进程,读取进程收到通知后再进行读取操作,从而解决了共享内存数据不同步的问题
标签:信号量,读取,写入,System,---,死锁,进程,using,共享内存 From: https://www.cnblogs.com/shulianggao/p/17999587