多缓冲区读写文件

版权声明: 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;

}

猜你喜欢

转载自blog.csdn.net/dashoumeixi/article/details/83548751