当前位置:  -> 首页 -> VC++ SDK开发方式下多进程并发写文件介绍

上一篇 | 下一篇
VC++ SDK开发方式下多进程并发写文件介绍
作者:洛羽叶  点击率:1817  发布时间:2012-11-14
在Windows平台采用VS 2010 C++语言开发多进程并发写文件操作主要采用CreateFile及WriteFile函数,参数组合要达到最高性能,请注意以下的设置。

CreateFile
FileHandle =::CreateFileA(FileNamePattern, GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

访问方式:只写采用GENERIC_WRITE, 只读采用GENERIC_READ。

共享方式:FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,允许其它人读、写、删除,如果要允许删除或改名请注意在CreateFile后记住GetFileTime文件创建时间,写文件前先判断当前文件GetFileTime创建时间和打开文件时是否一致。

打开方式:OPEN_ALWAYS,存在则打开,否则创建新文件。

SetFilePointer
写文件前先设置文件位置到文件尾部
::SetFilePointer(FileHandle, 
0NULL, FILE_END)
::WriteFile(FileHandle, buf, strlen(buf), &n, 
NULL);

刷新缓存到磁盘,注意没有特别要求不要采用,性能极低。
::FlushFileBuffers(FileHandle);

并发锁定,在高并发时多线程写会造成写文件重叠,要针对文件写操作采用CreateMutex创建互斥对象,参数以文件全路径为基础去除特殊字符(\, : , / )。

经过以上处理,单一线程写操作10000次 / 秒以上,多进程写可以达到60000次 / 秒。

注意如果涉及到判断文件大小,最好采用GetFileSizeEx,可以支持4GB以上的文件大小判断。

long long size = 0;
::GetFileSizeEx(hFile, (PLARGE_INTEGER)&size);

如果要在指定位置写入要采用SetFilePointerEx, 可以在4GB以上范围定位。

long long size = 1000;
::SetFilePointerEx(hFile, *(LARGE_INTEGER *)&size, 
NULL, FILE_BEGIN);
标签: C++ CREATEFILE C++
引用地址:本站原创
   站点首页      技术人生      旅途足迹      我要留言      友情链接      关于站长   
[本站统计]
在线人数:9
今日访问:28
总访问量:1936521
Copyright 2006-2022 EasyWeb 1.6 订阅 All Rights Reserved
粤ICP备08028977号-1
www.luoriver.com
Created by WWH in 2006