版权声明: https://blog.csdn.net/dashoumeixi/article/details/83548751
使用 OVERLAPPED 来读写大文件还错,如果是小文件性能不是特别好 , 这个仅仅是自己电脑的测试.
用多缓冲区来读写会比较快
一个例子:
const int __BUFFSIZE = 8192; //存放大小
const int __LEN = 10; //10个缓冲区
struct
{
struct{
char *data; //读入的地方
int readbytes; //读入字节数
}buff[__LEN];
HANDLE empty; //2个信号量
HANDLE stored;
} share;
unsigned int __stdcall read_thread(void* param)
{
HANDLE hFile = (HANDLE)param;
int i = 0;
DWORD bytesReaded = 0;
DWORD ret = 0;
while(1)
{
WaitForSingleObject(share.empty,-1);
//读取__BUFFSIZE 到缓冲区
ret = ReadFile(hFile,share.buff[i].data,__BUFFSIZE,&bytesReaded,NULL);
//每次把读取的字节数记录下来, 如果是0 则读完
share.buff[i].readbytes = bytesReaded;
if(!ret){
//出错的情况,把readbytes =0, 用于释放写线程
share.buff[i].readbytes = 0;
ReleaseSemaphore(share.stored,1,0);
cout << "error" << endl;
break;
}
//读完了
if(0 == bytesReaded){
ReleaseSemaphore(share.stored,1,0);
break;
}
//重置索引
if(++i > __LEN)
i = 0;
ReleaseSemaphore(share.stored,1,0);
}
return 0;
}
unsigned int __stdcall write_thread(void* param)
{
HANDLE hFile = (HANDLE)param;
int i = 0;
while(1)
{
WaitForSingleObject(share.stored,-1);
if(0 == share.buff[i].readbytes ){
break;
}
cout << share.buff[i].data << endl;
if(++i > __LEN)
i = 0;
ReleaseSemaphore(share.empty,1,NULL);
}
return 0;
}
void test_nbuff(const TCHAR* path)
{
HANDLE hFile = CreateFile(path,GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,
NULL,NULL);
//初始化, 第三个参数其实可以填 __LEN .
share.empty = CreateSemaphore(NULL,__LEN,100,NULL); //用于读线程, 一开始就10个信号量
share.stored = CreateSemaphore(NULL,0,100,NULL); //用于写线程
for(int i = 0; i < __LEN; ++i){
share.buff[i].data = new char[__BUFFSIZE];
share.buff[i].readbytes = 0;
}
HANDLE t_read = (HANDLE)_beginthreadex(0,0,read_thread,(void*)hFile,0,0);
HANDLE t_write = (HANDLE)_beginthreadex(0,0,write_thread,(void*)hFile,0,0);
WaitForSingleObject(t_read,-1);
WaitForSingleObject(t_write,-1);
cout << "done" << endl;
}