默認狀況下exe不一樣實例使用copy-on-write技術避免共享數據,好比運行了兩個exe,最開始它們使用的都是一份虛擬內存頁,而後第一個實例修改了全局變量, 這時候COW就會複製那一頁,而後將第一個進程地址空間對應頁映射到新複製的頁,第二個實例保持映射老的頁。 可是若是真的須要多個實例共享數據,好比計算有多少個exe程序正在運行,就能夠使用該技術。app
使用MSVC提供的code
#pragma date_seg("xx")
能夠在.obj中定義一個新的段,就像.data
.bss
.text
這種,而後爲了多個exe實例共享該段,還須要通知連接器將該段設置爲共享進程
#pragma comment(linker,"/SECTION:xx,RWS")
其中RWS
表示read write shared
,即指定該段共享。內存
示例代碼以下:it
#define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <stdio.h> #pragma data_seg("sharedvars") volatile unsigned int counter = 0; #pragma data_seg() #pragma comment(linker,"/SECTION:sharedvars,RWS") int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PTSTR, int) { InterlockedExchangeAdd(&counter, 1); char cbuf[255]; sprintf(cbuf,"There are %d app instances.",counter); MessageBox(NULL, cbuf, TEXT("Counting how many running application instances"), MB_ICONINFORMATION | MB_OK); InterlockedExchangeSubtract(&counter, 1); return 0; }