首页 > 系统相关 >共享内存 ---进程间通讯 解决死锁和数据损坏的问题 同时可以解决数据不同步的问题

共享内存 ---进程间通讯 解决死锁和数据损坏的问题 同时可以解决数据不同步的问题

时间:2024-01-31 16:56:31浏览次数:32  
标签:信号量 读取 写入 System --- 死锁 进程 using 共享内存

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

相关文章

  • Corretto-11源码-Java命令入口
    背景由于工作中需要开发编译器,开始阅读JavaC和JDK源码了解相关过程,并做出相关整理参考本文参考ChatGPT相关解释(很多内容都是杜撰,不可信),进行自我理解后整理发出项目https://github.com/corretto/corretto-11入口(src/java.base/share/native/libjli/java.c)入口文件为java.c......
  • kali学习笔记-06-Webshell文件上传漏洞使用
    kali学习笔记-06-Webshell文件上传漏洞使用KaliLinux网络安防一、使用weevely制作一句话木马脚本在KaliLinux的终端中输入命令weevely,可以从错误提示中看到基本的使用方法。二、配置OWASP靶机三、参考文献WebShell文件上传漏洞.3......
  • 洛谷题单指南-暴力枚举-P1088 [NOIP2004 普及组] 火星人
    原题链接:https://www.luogu.com.cn/problem/P1088题意解读:火星人的手指可以通过全排列来表示数字,全排列由小到大的顺序即为表示的数字大小,题目可以转化为:给定按顺序全排列中的某一个排列,求往后数m个排列的内容。解题思路:此题与经典全排列问题的差异在于,需要从指定一个排列开......
  • easyui-datagrid 加载数据 方法一( 数据绑定方式 )
     效果图 html 部分<divstyle='padding:0px0px7px12px;'><tableclass="my_table"><tr><tdclass='my_dt_label'>姓名:</td><tdclass='......
  • 无涯教程-Number.NEGATIVE_INFINITY函数
    这是一个特殊的数值,表示小于Number.MIN_VALUE的值。该值表示为"-Infinity"。如,任何乘以NEGATIVE_INFINITY的值为NEGATIVE_INFINITY,而除以NEGATIVE_INFINITY的值为零。因为NEGATIVE_INFINITY是一个常数,所以它是Number的只读属性。Number.NEGATIVE_INFINITY-语法varval=Numbe......
  • EasyRecovery - 完美破解,免费使用
    我们在平时使用电脑或者操作文件过程中,或多或少都有过格式化文件或者为了方便,直接摁住了shifit+delete键;删除后发现,我们删错了,有些文件不是我们要删的,甚至有的文件是特别重要的;这时候恢复数据的软件就粉亮登场了;来吧,展示:我历尽千辛万苦,找了不少的软件和安装了很多次,多次尝试终于......
  • 无涯教程-Number.Nan函数
    不带引号的文字常量NaN是表示非数字的特殊值。由于NaN总是比较不等于任何数字(包括NaN),因此它通常用于返回有效数字的函数的错误情况。Number.Nan-语法varval=Number.NaN;Number.Nan-示例vardayOfMonth=50;if(dayOfMonth<1||dayOfMonth>31){dayOfMonth......
  • Debug: ERROR: Directory '*py3-none-any.whl' is not installable. Neither 'setup.
    [ERROR:Directory'*py3-none-any.whl'isnotinstallable.Neither'setup.py'nor'pyproject.toml'found.]kubectllgostrainer-pod-name-nkubeflow-->,pipeline_info=id:"detect_anomolies_on_wafer_tfdv_schema"......
  • 洛谷题单指南-暴力枚举-P1706 全排列问题
    原题链接:https://www.luogu.com.cn/problem/P1706题意解读:n个数全排列问题,本质上,给定n个空位,枚举每个能填入空位的数,依次填入,每个数只能填一次。解题思路:如何填入n个数呢,可以借助于递归,流程如下:dfs(填入第k个数){如果已经填满n个数输出结果返回......
  • PLSQL重命名表的方法和报错解决方法ORA-01765 ORA-14047
    重命名办法在PLSQL中重命名表,在表上点右健选重命名。 报错ORA-01765若不是本用户,会报错:ORA-01765:不允许指定表的所有者名称。 解决方法,使用RENAME命令在PLSQL执行不会报错。示例:ALTERTABLEuser1.log_tablenameRENAMETOlog_tablename_back20240131; 报错ORA-14047......