原理:
如果一個應用程序的實例已經運行,那麼當再運行一個實例時,系統只會爲這個實例創建一個新的內存映射視圖,這個內存映射視圖會被映射到第一個實例所映射的虛擬內存中,這樣就可以在多個實例之間共享內存中的代碼和數據,可以通過數據來控制運行實例的個數即可。當然,要實現多個實例的數據共享,不是簡單的使用全局變量就行了,應用程序的文件映像會被分到不同的段中:
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--; }