?? 4-4.cpp
字號:
// mappings項目
# include <windows.h>
# include <iostream>
// 仲裁訪問的互斥體
static HANDLE g_hMutexMapping = INVALID_HANDLE_VALUE;
// 增加共享內存中的數值的簡單線程
static DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// 將參數看作句柄
HANDLE hMapping = reinterpret_cast <HANDLE> (lpParam) ;
// 等待對文件的訪問
:: WaitForSingleObject(g_hMutexMapping, INFINITE) ;
// 映射視圖
LPVOID pFile = :: MapViewOfFile(
hMapping, // 保存文件的對象
FILE_MAP_ALL_ACCESS, // 獲得讀寫權限
0, // 在文件的開頭處 (高32位) 開始
0, // ... (低32位)
0) ; // 映射整個文件
if (pFile != NULL)
{
// 將數據看作長整數
LONG * pnData = reinterpret_cast <LONG *> (pFile) ;
// 擾動數據
++ (* pnData) ;
// 顯示新數值
std :: cout << "thread: " << :: GetCurrentThreadId()
<< "value: " << (* pnData) << std :: endl;
// 釋放文件視圖
:: UnmapViewOfFile(pFile) ;
pFile = NULL;
}
// 釋放對文件的訪問權
:: ReleaseMutex(g_hMutexMapping) ;
return(0) ;
}
// 創建共享數據空間
HANDLE MakeSharedFile()
{
// 創建文件映射對象
HANDLE hMapping = :: CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用頁式文件臨時文件
NULL, // 缺省的安全性
PAGE_READWRITE, // 可讀寫權
0, // 最大容量 (高32位)
sizeof(LONG) , // ... (低32位)
NULL) ; // 匿名的
if (hMapping != INVALID_HANDLE_VALUE)
{
// 在文件映射上創建視圖
LPVOID pData = :: MapViewOfFile(
hMapping, // 保存文件的對象
FILE_MAP_ALL_ACCESS, // 獲得讀寫權
0, // 在文件的開頭處(高32位)開始
0, // ... (低32位)
0 ) ; // 映射整個文件
if (pData != NULL)
{
:: ZeroMemory(pData, sizeof(LONG)) ;
}
// 關閉文件視圖
:: UnmapViewOfFile(pData) ;
}
return (hMapping) ;
}
void main()
{
// 創建數據文件
HANDLE hMapping = :: MakeSharedFile() ;
// 創建仲裁的互斥體
g_hMutexMapping = :: CreateMutex(NULL, FALSE, NULL) ;
// 根據文件創建100個線程來讀寫
for (int nTotal = 100; nTotal > 0; -- nTotal)
{
// 啟動線程
HANDLE hThread = :: CreateThread(
NULL, // 缺省的安全性
0, // 缺省堆棧
ThreadProc, // 線程函數
reinterpret_cast <LPVOID> (hMapping) , // 增量
0, // 無特殊的創建標志
NULL) ; // 忽略線程id
// 等待最后的線程釋放
if (nTotal == 1)
{
std :: cout << "all threads created, waiting..." << std :: endl;
:: WaitForSingleObject(hThread, INFINITE) ;
}
:: Sleep(500) ; // 將這條語句關閉試試看結果會如何
// 釋放指向線程的句柄
:: CloseHandle(hThread) ;
hThread = INVALID_HANDLE_VALUE;
}
// 關閉對象
:: CloseHandle(hMapping) ;
hMapping = INVALID_HANDLE_VALUE;
:: CloseHandle(g_hMutexMapping) ;
g_hMutexMapping = INVALID_HANDLE_VALUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -