www.pudn.com > OS.rar > 4-1.cpp
// fileobj项目 # include# include // 要使用的文件名 static LPCTSTR g_szFileName = "w2kdg.Fileobj.file.data.txt" ; // 在数据文件中读取当前数据的简单线程时将传递来的该数据增加,并写回数据文件中 static DWORD WINAPI ThreadProc (LPVOID lpParam) { // 将参数翻译为长整数 LONG nAdd = reinterpret_cast (lpParam) ; // 建立完全的指定文件名 TCHAR szFullName [MAX_PATH] ; :: GetTempPath(MAX_PATH, szFullName) ; :: strcat(szFullName, g_szFileName) ; // 打开文件对象 HANDLE hFile = :: CreateFile( szFullName, // 文件的完全名称 GENERIC_READ | GENERIC_WRITE, // 具有所有的访问权 FILE_SHARE_READ, // 允许其他线程读取 NULL, // 缺省的安全性 OPEN_ALWAYS, // 创建或打开文件 FILE_ATTRIBUTE_NORMAL, // 普通文件 NULL) ; // 无模板文件 if (hFile != INVALID_HANDLE_VALUE) { // 读取当前数据 LONG nValue(0) ; DWORD dwXfer(0) ; :: ReadFile( hFile, // 要读取的文件 reinterpret_cast (&nValue) , // 缓冲区 sizeof(nValue) , // 缓冲区容量 &dwXfer, // 读取的字节数 NULL) ; // 无重叠I/O if (dwXfer == sizeof(nValue) ) { // 显示当前数据 std :: cout << "read: " << nValue << std :: endl; } // 增加数值 nValue += nAdd; // 写回永久存储介质 :: SetFilePointer(hFile, 0, NULL, FILE_BEGIN) ; :: WriteFile( hFile, // 要写入的文件 reinterpret_cast (&nValue) , // 数据 sizeof(nValue), // 缓冲区容量 &dwXfer, // 写入的字节数 NULL) ; // 无重叠I/O if (dwXfer == sizeof(nValue) ) { std :: cout << "write: " << nValue << std :: endl; } // 清除文件 :: CloseHandle(hFile) ; hFile = INVALID_HANDLE_VALUE; } return(0) ; } void main() { // 创建100个线程从文件中进行读写 for (int nTotal = 100; nTotal > 0; --nTotal) { // 启动线程 HANDLE hThread = :: CreateThread( NULL, // 缺省的安全性 0, // 缺省的堆栈 ThreadProc, // 线程函数 reinterpret_cast (1) , // 增量 0, // 无特殊的创建标志 NULL) ; // 忽略线程id // 等待线程完成 :: WaitForSingleObject(hThread, INFINITE) ; // 释放指向线程的句柄 :: CloseHandle(hThread) ; hThread = INVALID_HANDLE_VALUE; } }