www.pudn.com > mappings项目.rar > 4-4.cpp
// mappings项目 # include# include // 仲裁访问的互斥体 static HANDLE g_hMutexMapping = INVALID_HANDLE_VALUE; // 增加共享内存中的数值的简单线程 static DWORD WINAPI ThreadProc(LPVOID lpParam) { // 将参数看作句柄 HANDLE hMapping = reinterpret_cast (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 (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 (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; }