繁体   English   中英

单个文件在多个ifstream中打开奇怪的行为

[英]single file opened in several ifstreams strange behavior

我正在学习有关fstream的知识,偶然发现了一个奇怪的问题。

我有一个非常简单的程序,即复制文件-复制代码在这里:

void CCopyFile::Start(){
    std::ifstream src(mSrc, std::ifstream::binary); // mSrc and mDst strings
    std::ofstream dst(mDst, std::ofstream::binary); // with path to files

    if (src.is_open() && dst.is_open()){
        mCurr = src.tellg();  // std::streampos
        src.seekg(0, std::ios::end);
        mFileSize = src.tellg() - mCurr; // std::streampos
        src.seekg(0, std::ios::beg);
        mCurr = 0;

        while (mCurr < mFileSize){
            if (mFileSize - mCurr < mBufSize){
                delete[] mBuf;
                mBufSize = mFileSize - mCurr;
                mBuf = new char[mFileSize - mCurr];

                src.read(mBuf, mBufSize);
                dst.write(mBuf, mBufSize);
                mCurr += mBufSize;
            } else {
                src.read(mBuf, mBufSize);
                dst.write(mBuf, mBufSize);
                mCurr += mBufSize;
            }
        }
        src.close();
        dst.close();
    }
}

如果我放置了该类的几个并行实例来复制不同的文件,那么一切正常-供参考,这是每10秒检查一次复制进度的函数的控制台输出:

[d:\a] -> [d:\outfile]
[1456448MB] -> [5212616MB]
[d:\zz] -> [d:\outfile2]
[259200MB] -> [5212616MB]

但是,如果我多次启动相同文件的复制-我会得到:

[d:\a] -> [d:\out1]
[1375232MB] -> [5212616MB]
[d:\a] -> [d:\out2]
[1375232MB] -> [5212616MB]

这里最有趣的部分:如果我启动1个复制过程-一切都很好,复制的文件正在增长。 如果我启动该文件的第二个复制过程-第二个复制文件将在第一个线程中创建相同大小的副本,然后我将始终得到,这两个线程以某种方式准确地读取了同一文件。 我不知道。 也许第一个ifstream对文件有一些独特的锁定?

完整代码在这里-> http://pastebin.com/NRVvxuSg

由于文件已全部缓存在RAM中,因此同一文件的第二次读取将比第一次读取快得多。 这意味着,如果一个线程落后于另一个线程,则其读取速度将更快,并且将赶上前面的线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM