用内存映射文件实现应用程序只运行一个实例

  原理:

         如果一个应用程序的实例已经运行,那么当再运行一个实例时,系统只会为这个实例创建一个新的内存映射视图,这个内存映射视图会被映射到第一个实例所映射的虚拟内存中,这样就可以在多个实例之间共享内存中的代码和数据,可以通过数据来控制运行实例的个数即可。当然,要实现多个实例的数据共享,不是简单的使用全局变量就行了,应用程序的文件映像会被分到不同的段中:

    READ:可读数据段

    WRITE:可写数据段

    EXECUTE:可执行数据段

    SHARED:该段的内容会被多个实例共享

   编译器在默认情况下,数据都不会被放到SHARED中,要想把数据发到该段中,需要特别告诉给编译器,用2种方法:

方式1 #pragma data_seg("Shared")
   int g_iAppInstance=1;
   #pragma data_seg()
 

   #pragma data_seg("name"),当编译器执行到这句时,会将其之下出现的已经初始化的变量放到shared段中

   #pragma data_seg(),表示恢复默认

方式2

#pragma data_seg("Shared")

__declspec(allocate("Shared")) int  g_iAppInstance;
 #pragma data_seg()

这个和方式1的区别是不需要初始化

 

除此之外,还要告诉连接器要共享这些变量:
#pragma comment(linker,"/SECTION:Shared,RWS")

 

示例代码如下:

  

#include <iostream> using namespace std; //1 #pragma data_seg("Shared") int g_iAppInstance=1; #pragma data_seg()

 

//2 // #pragma data_seg("Shared") // __declspec(allocate("Shared")) int g_iAppInstance; // #pragma data_seg()

 

#pragma comment(linker,"/SECTION:Shared,RWS")

void main() {  if(g_iAppInstance==1)  {   g_iAppInstance++;   cout<<"I am running.\n";   system("pause");  }  else  {   exit(1);  }  g_iAppInstance--; }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值