进程同步(读写共享内存)

qt IPC 之共享内存 qt 共享内存 阅读详情


进程同步(读写共享内存)

一、简介

       本文展示了如何使用Win32事件来解决多个读、写线程的同步问题。在编译了源码之后,你会得到作为读、写共享内存而存在的控制台应用程序。同时可以执行多个程序用于测试。但是某一时刻只允许一个程序执行写操作。如果某一个写操作在执行,那么其他读、写程序都会被阻塞。然而,多个读操作可以同时运行。如果读操作正在执行,那么写操作只有在所有读操作完成之后才能处理。这种同步机制确保了读写操作正确同步、避免任意时刻的数据冲突。

二、源码分析

       源码中包含了读写操作使用的共享内存,使用事件机制来实现同步功能。

下面是初始化事件和共享内存的代码:

//初始化事件对象和共享内存对象
bool Initialize()
{
	char szBuffer[32];
	for(int i=0; i<MAX_READ_PROCESSES_ALLOWED; i++)
	{
		sprintf_s(szBuffer, "Reader_%d", i);
		//创建读事件
		g_hReadEvent[i] = CreateEvent(NULL, false, true, szBuffer);
		if(NULL == g_hReadEvent[i])
			return false;
	}

	//创建写事件 
	g_hWriteEvent = CreateEvent(NULL, false, true, g_szWriteName);
	if(NULL == g_hWriteEvent)
		return false;

	//创建共享内存缓冲区
	g_hShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE, 
		NULL, PAGE_READWRITE, 0, MAX_SHARE_MEM_SIZE, g_szShareMemoryName);

	if(NULL==g_hShareMemory || INVALID_HANDLE_VALUE==g_hShareMemory)
	{
		printf("Error occured shile creating file mapping object\n");
		return false;
	}

	g_pBuffer = (LPTSTR)MapViewOfFile(g_hShareMemory, FILE_MAP_ALL_ACCESS, 0, 0, MAX_SHARE_MEM_SIZE);
	if(NULL == g_pBuffer)
	{
		printf("Error occured while mapping view of the file\n");
		return false;
	}

	return true;
}

void ReadAndPrint()
{
	printf("从共享内存中读取数据并打印...\n");
	//等待所有的写操作结束,数据已经同步
	bool bContinue = true;
	while(bContinue)
	{
		printf("等待写操作完成...、\n");
		DWORD dwWaitResult = WaitForSingleObject(g_hWriteEvent, INFINITE);
		if(WAIT_OBJECT_0 == dwWaitResult)
		{
			bool bEventFount = false;
			for(int i=0; i<MAX_READ_PROCESSES_ALLOWED; i++)
			{
				DWORD dwWaitResult = WaitForSingleObject(g_hReadEvent, WAIT_TIMEOUT);
				if(WAIT_OBJECT_0 == dwWaitResult)
				{
					bEventFount = true;
					printf("设置写事件...\n");
					SetEvent(g_hWriteEvent);
					//读共享内存
					printf("共享内存中内容是:%s\n", g_pBuffer);
					printf("设置读事件...\n");
					SetEvent(g_hReadEvent[i]);

					bContinue = false;
					break;
				}
				else
				{
					continue;
				}
			}
		}
		else
		{
			printf("等待出错:%d\n", GetLastError());
		}
	}
}

//写函数使用事件来同步
void WriteAndPrint()
{
	printf("写人并输出共享内存数据...\n");
	printf("等待写操作结束...\n");

	if(WAIT_OBJECT_0 == WaitForSingleObject(g_hWriteEvent, INFINITE))
	{
		printf("等待所有读操作结束...\n");
		DWORD dwWaitResult = WaitForMultipleObjects(MAX_READ_PROCESSES_ALLOWED, 
			g_hReadEvent, TRUE, INFINITE);

		if(WAIT_OBJECT_0 == dwWaitResult)
		{
			printf("输入字符串:(不要空格):");
			printf("%s", g_pBuffer);
			printf("共享内存数据:%s", g_pBuffer);
		}
		else
		{
			printf("等待出错:%d", GetLastError());
		}

		printf("设置写事件...\n");
		SetEvent(g_hWriteEvent);
		printf("设置读事件...\n");
		for(int i=0; i<MAX_READ_PROCESSES_ALLOWED; i++)
		{
			SetEvent(g_hReadEvent[i]);
		}
	}
	else
	{
		printf("deng\n");
	}
}

void DdeInitialize()
{
	for(int i=0; i< MAX_READ_PROCESSES_ALLOWED; i++)
	{
		CloseHandle(g_hReadEvent[i]);
	}

	CloseHandle(g_hWriteEvent);
	UnmapViewOfFile(g_pBuffer);
	CloseHandle(g_hShareMemory);
}

int _tmain(int argc, _TCHAR* argv[])
{
	if (Initialize())
     {
          ...
     }
     else
     {
         ...
     }
     
     bool bContinue = true;
     
     while(bContinue)
     {
          DisplayOptions();
          bContinue = RecvAndProcessOption();
     }
     
     DeInitialize();
     
     return 0; //success
}


Linux 进程同步实战:3种共享内存通信模式对比与性能实测 本文深入探讨Linux系统中三种共享内存通信模式:生产者-消费者模型、读写锁模型和无锁环形队列,通过性能实测数据对比它们在进程同步中的表现。文章详细分析了每种模式的实现原理、适用场景及性能特点,为开发者提供高效的进程间通信解决方案,特别适合需要处理操作系统级进程同步与死锁问题的场景。 阅读详情

相关推荐

TMS320F280039 CMD文件配置避坑指南:从.map文件看懂内存分配与溢出排查

本文详细解析了TMS320F280039芯片的CMD文件配置问题,通过.map文件分析内存分配与溢出排查。文章提供了实用的诊断技巧和解决方案,帮助开发者有效应对段溢出、地址重叠和栈堆冲突等常见问题,优化DSP程序的内存管理。

weixin_29168813的博客 442

Windows程序设计应用开发

养具备Win32 API SDK级别对Windows平台程序编码能力,可以参与Windows应用工程类别的GUI程序开发,对算法策略有容错性表现;提升的、软件设计经验,初步具备面向对象软件设计思想,能针对性的应用事件驱动编程开发应用程序。丁宋涛老师是南京大学博士,微软中国认证讲师,任江苏微软技术中心、美国大学理事会计算机学科教师,捷帝科技有限公司联合创始人,拥有15年以上程序开发经验。

SAGA GIS英文版进行地形分析,计算常用的地形因子等

SAGA GIS中文版是一款专业的自动化地球科学分析系统软件。SAGA GIS最新版界面简洁,操作简便,用户使用时输入要分割的影像,选择要计算特征的影像或者波段,设置越大,得到的斑块越大;反之,则越小,点击Okay,得到分割影像图。SAGA GIS中文版主要通过选择适合你影像的格式,加载影像。 SAGA GIS全称是System for Automated Geoscientific Analyses,是一种用于编辑空间数据的地理信息系统(GIS)计算机程序,它是免费的开源软件,SAGA GIS旨在为科学家

qq_35794085的博客 5640

经典进程同步问题(三)——读者写者问题

读者写者问题三种解决方案的代码详述:读者优先、写者优先、读写公平

aimat2020的博客 2万+

Vivado实战:从零封装AXI-Lite接口的呼吸灯IP核

本文提供了一份详细的Vivado实战指南,手把手教你如何将Verilog编写的呼吸灯模块封装成带AXI-Lite接口的IP核。内容涵盖从创建IP框架、编写核心逻辑、连接AXI总线到在ZYNQ系统中调用并编写C程序进行软硬件协同测试的完整流程,是掌握FPGA软硬件协同设计的关键实践。

weixin_29233333的博客 596

Matlab实战:用卡尔曼滤波搞定无人机GPS轨迹优化(附完整代码)

本文详细介绍了如何使用Matlab实现卡尔曼滤波(KF)算法优化无人机GPS轨迹,提供完整代码和工程实践指南。通过线性卡尔曼滤波技术,有效降低定位噪声,提升轨迹平滑度,适用于无人机导航和控制系统开发。

weixin_29061425的博客 253

如何实现C++读写进程内存值

ReadProcessMemory是一个内存操作函数,其作用为根据进程句柄读入该进程的某个内存空间;由布尔声明可以看出,当函数读取成功时返回1,失败则返回0,具体参数含义将在下文中指出。WriteProcessMemory是计算机语言中的一种函数。此函数能写入某一进程的内存区域(直接写入会出AccessViolation错误),故需此函数入口区必须可以访问,否则操作将失败。.........

Meta.Qing的博客 7888

从零到精通:ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程

本文详细介绍了ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程,从环境准备到高级功能扩展,帮助开发者实现精准控制。通过集成模型预测控制(MPC),机械臂能够优化复杂轨迹规划,处理动态避障,提升工业自动化效率。

juice的博客 705

linux环境下的进程同步,基于嵌入式操作系统Linux环境中的没有竞争态读写进程同步设计...

引 言在对实时采集更新的数据进行处理时,往往会遇到数据更新速度与数据处理的速度不匹配的问题。这种情况下,会出现数据丢失而导致数据处理结果不准确,甚至会带来不可预测的后果,因此需要一种机制来协调数据更新与数据处理,从而保证数据的完整性和处理结果的准确性。作为一个多任务、多用户操作系统,Linux 支持多个进程在系统中并发运行,由于进程本身的动态特性,用来描述实时数据处理非常合适,因此,解决好Linu...

weixin_39743622的博客 186

【嵌入式 – GD32开发实战指南(ARM版本)】第1部分 基础篇 - 第1章 开发环境搭建

开发环境: MDK:Keil 5.30 MCU:GD32F207IK 1.1 GD32F207I-EVAL开发板简介 笔者使用的开发板是兆易创新设计的GD32F207I-EVAL开发板。 GD32F207I-EVAL开发板使用 GD32F207IK作为主控制器,主频120MHz、集成3MB Flash、256KB SRAM、通用定时器*10、Adv. TM*2、Basic TM*2、系统时钟*1、看门狗*2、RTC*1、USART*4、UART*4、I2C*3、SPI*3、I2S*1、SDIO*1、CAN

不问归期的博客 9985

Bert+CNN文本分类(含代码实现)

一、什么是CNN? CNN的特点: (1)特定特征位移不变性 (2)特征缩放不变性 2. CNN模型构造过程 2.1 Convolution(卷积) (1)获取关键特征(减少参数) (2)共享权重(再次减少参数) 2.2 Max Pooling(池化) 2.3 Flatten 向量转换为如图所示可以进入全连接层的向量模式 3. TextCNN 上图可理解为: 通过不同的size(如上图2、3、4等),上图红色代表 size=2,黄色...

Python,数据分析,机器学习,深度学习 1万+

Win32 API(读写内存)

使用windows API 访问进程内存

GNAIXGNAHZ的博客 1724

【蓝凌表单】JSP组件常用语法整理

【代码】【蓝凌表单】JSP组件常用语法整理。

烧硬盘 708

Linux网络编程——进程、线程同步方式

要注意这里的同步并不是指同时进行的意思,而是按照先后顺序依次进行。

qq_74811378的博客 1293

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

操作系统--知识点总结4(线程同步、进程同步)

文章目录一、线程同步1、线程同步之互斥量2、线程同步之自旋锁3、线程同步之读写锁4、线程同步之条件变量5、线程同步方法总结二、进程同步1、进程同步之共享内存2、进程同步之Unix域套接字 一、线程同步 1、线程同步之互斥量 2、线程同步之自旋锁 3、线程同步之读写锁 4、线程同步之条件变量 5、线程同步方法总结 二、进程同步 1、进程同步之共享内存 2、进程同步之Unix域套接字 ...

ANingL的博客 697

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux和windows进程同步与线程同步那些事儿(五):Linux下进程同步

linux进程同步讲解

Mr.Sugarcane 1581

Linux 进程同步实战:共享内存与 POSIX 信号量 3 种典型场景代码对比

本文深入探讨了Linux进程同步的两种主流机制——共享内存和POSIX信号量,并通过生产者-消费者、读写者和多进程协作三种典型场景的代码对比,分析了它们的性能特点和适用场景。文章提供了详细的代码示例和性能对比表格,帮助开发者理解如何在进程同步中避免死锁并提升效率。

weixin_33563728的博客 361

【Windows进程通信】共享内存

共享内存主要是通过映射机制实现的。   Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的。所谓的重叠是指同一块内存区域可能被多个进程同时使用。系统把同一块内存区域映射到了不同进程的地址空间中,从而达到共享内存的目的。   示例代码中,一方是QT编写的程序来创建并读取共享内存的内容,另一方是VC程序修改共享内存中的内容:   QT: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #

Flywithdawn的博客 1621

编程大法—炼体筑基—操作系统—提升篇

作为顶层应用开发者,我们关注的不仅仅是数目庞大的API,也要定性的理解计算机体系中每一个层次的逻辑。 生产者消费者问题和哲学家问题中,我们可以将产品库或筷子视作临界资源,不同进程或者线程对临界资源的读写就引出了线程同步或者进程同步。 保护临界资源/进行通信可以理解为进程同步或者线程同步,其中线程同步的方法有互斥量、读写锁、自旋锁、条件变量,进程同步的方法有共享内存、域套接字等。一系列的操作不能被中断就可以称这些操作具有原子性。原子是物质所表现出特性的基本单位。 互斥量(互斥锁) 当一个线程开始读写临界资源时

codeIsGood的博客 306

计算机操作系统进程同步实验报告,操作系统进程同步实验报告

操作系统进程同步实验报告 实验三:进程同步实验 一、实验任务: (1)掌握操作系统的进程同步原理; (2)熟悉 linux 的进程同步原语; (3)设计程序,实现经典进程同步问题。 二、实验原理: (1)P、V 操作PV 操作由 P 操作原语和 V 操作原语组成(原语是不可中断的过程) ,对信号量进行 操作,具体定义如下:P(S):①将信号量 S 的值减 1,即 S=S-1;②如果 S³0,则该进...

weixin_33973421的博客 1885

线程同步、进程同步、互斥量、信号量、条件变量等

线程同步 临界区criticalsections,互斥量mutex互斥锁,事件通知机制event,信号量semaphore,读写锁,条件变量condition,自旋锁,其他概念 进程同步 信号量,信号signal,管道,消息队列,共享内存,文件,套接字socket通信...

knowledgebao的博客 786

linux C学习笔记02--共享内存(进程同步)

system V下3中进程同步:共享内存(shared memory),信号量(semaphore)和消息队列(message queue) 调试了下午,终于调通啦! 运行./c.out 输出共享内存中的内容,运行 ./c.out arg1 对共享内存区进行修改,shell下输入ipcs -m 可以查看共享内存情况,-s 是信号量,-q 是消息队列 下面先贴上main的代码: #i...

weixin_33875839的博客 139

进程间通信——共享内存

共享内存是一种高效的进程间通信(IPC, Inter - Process Communication)机制。多个进程可以将同一块物理内存区域映射到各自的进程地址空间中,这样这些进程就可以直接对这块共享的内存区域进行读写操作,从而实现数据的共享和交换。由于不需要进行数据的复制(如通过管道或消息队列等方式),共享内存避免了数据在用户空间和内核空间之间的频繁拷贝,因此具有很高的通信效率。

weixin_75197906的博客 1258

计算机基础——操作系统:提升

1、导学   前面所学的“生产者-消费者问题”以及“哲学家问题”,他们都要访问临界资源,在某些情况下会出现问题,因此我们必须要进行线程以及进程的同步。 2、线程同步之互斥量   注意,互斥锁是给临界资源加锁,即一个线程在操作临界资源的时候,就给这个临界资源加锁,此时其他的线程不能操作这个临界资源。 3、线程同步之自旋锁 4、线程同步之读写锁   我们在读取临界资源的时候,即使多线程同时在读取,也不会产生线程同步的问题。但是如果多个线程同时对临界资源进行写操作(即改变..

LKJgdut的博客 346

Linux内核同步,进程,线程同步

<br />包括我自己在内,很多人对内核,进程,线程同步都不是很清楚,下面稍微总结一下:<br /> <br />内核同步:<br />主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区保护。主要有一下几种方式:<br />1. Mutex(互斥)<br />头文件:<br />#include <linux/mutex.h><br />初始化方法:<br />DEFINE_MUTEX(name);或者<br />void mutex_init(struct mutex *lock);

babyfans的专栏 1148

计算机基础五:操作系统提升篇,Github标星5.3K

2.1、自旋锁概述 2.2、自旋锁的特点 3、线程同步之读写锁 3.1、什么是读写锁 4、线程同步之条件变量 5、线程同步方法总结 6、使用fork系统调用创建进程 7、进程同步之共享内存 7.1、共享内存特点: 7.2、使用共享内存的步骤 8、进程同步之Unix域套接字 8.1、概述 1、线程同步之互斥量 ========== 图二: 1.1、原子性 图三: 图三 2、线程同步之自旋锁 ========== 2.1、自旋锁概述 2.2、自旋锁的特点 3、线程同步之读写锁 ======

m0_65322636的博客 420
上一篇: 多数据库支持类库
下一篇: TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR<一>
FightForProgrammer
博客等级 码龄13年 239粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值