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