多缓冲区读写文件

本文探讨了在处理文件读写时,如何通过使用多缓冲区策略来提高性能。相比于单缓冲区或小文件的OVERLAPPED操作,多缓冲区在处理大文件时能展现出更好的效率。文中提供了一个实际示例来说明这一技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

使用 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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值