Windows 下利用 CreateFileMapping / MapViewOfFile API 可輕鬆實現進程間共享記憶體,類似 Linux shm 機制。下方提供一個可直接使用的 C++ 封裝類 shareMemory,支援檔案映射與分頁檔映射兩種模式。
class shareMemory {
private:
LPWSTR shm_name_u;
bool is_create_file; // true=檔案映射,false=分頁檔映射
void* sh_base; // 映射基址
HANDLE semaphore; // 同步用信號量
HANDLE file_mapping; // 映射物件控制碼
int addr_len; // 映射大小
public:
// 建構子:指定名稱與模式
shareMemory(const std::string& name, bool create_file = false);
// 開啟/建立映射區
// addr: 指定映射位址(NULL 由系統決定)
// length: 映射大小(位元組)
// protect: PAGE_READWRITE / FILE_MAP_READ 等
void* shm_open(void* addr, int length, DWORD protect);
// 寫入資料,返回實際寫入位元組數
int shm_write(void* dest, void* src, int size);
// 讀取資料,返回實際讀取位元組數
int shm_read(void* src, void* dest, int size);
// 解構子:釋放所有資源
~shareMemory();
};
create_file=true):在磁碟建立同名檔案,資料持久化,進程結束後內容保留WaitForSingleObject / ReleaseSemaphore 保護讀寫區段check_adress() 防止越界存取FlushViewOfFile 確保資料落盤(檔案模式)int main() {
shareMemory sm("boost", false); // 分頁檔模式
void* bs = sm.shm_open(NULL, 1000*4, FILE_MAP_WRITE);
if (!bs) return -1;
int a[10] = {0,1,2,3,4,5,6,7,8,9};
sm.shm_write(bs, a, 10*4);
Sleep(100000); // 保持映射存活供讀取進程存取
return 0;
}
int main() {
shareMemory sm("boost", false);
void* bs = sm.shm_open(NULL, 1000, FILE_MAP_READ);
if (!bs) return -1;
int b[10];
sm.shm_read(bs, b, 10*4);
for (int i=0; i<10; ++i) std::cout << b[i] << " ";
return 0;
}
kernel32.lib(Visual Studio 預設已包含)Global\\ 前綴,且需 SeCreateGlobalPrivilege 權限此封裝類已涵蓋建立、開啟、讀寫、同步、清理完整生命週期,可直接整合至專案中作為高效 IPC 機制。