博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
相同程序不同进程下实现数据共享
阅读量:4299 次
发布时间:2019-05-27

本文共 1228 字,大约阅读时间需要 4 分钟。

格式:

#pragma comment(linker,"/section:MyData,rws")#pragma data_seg("MyData")   int g_iProNum = -1;#pragma data_seg()

说明:

  1. 以全局变量来定义,即函体之外;
  2. 必需初始化,否则编译器会把未初始化的变量放到.BSS段中;
  3. /SECTION:自己的数据段名,RWS,R为允许读,W为允许写,S为允许共享

第1步: 新建控制台程序,代码如下:

#include "stdafx.h"#include 
#pragma comment(linker,"/section:DataShare,rws")#pragma data_seg("DataShare")int g_ValueA = 0; // 全局变量,要赋值#pragma data_seg()int _tmain(int argc, _TCHAR* argv[]){ if (!g_ValueA) { printf("%d:%d\n",&g_ValueA,g_ValueA); g_ValueA=1; } printf("%d:%d\n",&g_ValueA,g_ValueA); system("pause"); return 0;}

第2步: 运行Debug中的exe,可以看到先后运行的两个exe数据的变化

这里写图片描述 这里写图片描述

注意: 进程间共享的是相同的物理地址,不同进程对应相同物理地址的虚拟地址并不相同,进程间不能共享指针,因为指针指向的是虚拟地址对应的数据,在另一进程中该虚拟地址并不指向原来的物理地址,例如

#include "stdafx.h"#include 
#pragma comment(linker,"/section:DataShare,rws")#pragma data_seg("DataShare")int *g_ValueA = NULL; // 全局变量,要赋值#pragma data_seg()int _tmain(int argc, _TCHAR* argv[]){ int a = 10; if (NULL == g_ValueA) { g_ValueA = &a; printf("%d:%d\n",g_ValueA,*g_ValueA); (*g_ValueA)++; } else { printf("%d:%d\n",g_ValueA,*g_ValueA); } system("pause"); return 0;}

该程序运行结果如下

这里写图片描述 这里写图片描述

这是由于第一进程中虚拟地址对应的物理空间a变为11,而第二进程收到的该虚拟地址对应的该进程的a还是等于10

你可能感兴趣的文章
XPATH入门
查看>>
python爬虫 CSS选择器
查看>>
正常关闭java程序
查看>>
查看linux核心数
查看>>
数据结构与算法三: 数组
查看>>
Activiti工作流会签二 启动流程
查看>>
Activiti工作流会签三 撤销,审批,驳回
查看>>
Oauth2方式实现单点登录
查看>>
CountDownLatch源码解析加流程图详解--AQS类注释翻译
查看>>
ES相关度评分
查看>>
我们一起做一个可以商用的springboot脚手架
查看>>
idea在搭建ssm框架时mybatis整合问题 无法找到mapper
查看>>
java设计基本原则----单一职责原则
查看>>
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>