Windows多個應用程序共享全局變量,靜態變量

默認狀況下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;
}
相關文章
相關標籤/搜索