单个文件在几个ifstreams中打开了奇怪的行为

时间:2014-10-17 12:37:51

标签: c++ multithreading ifstream

我正在学习关于fstreams的东西,偶然发现了一些奇怪的问题。

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

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有一些独特的锁定文件?

此处提供完整代码 - &gt; http://pastebin.com/NRVvxuSg

1 个答案:

答案 0 :(得分:2)

同一文件的第二次读取将比第一次读取快得多,因为数据已经全部缓存在RAM中。这意味着如果一个线程落后于另一个线程,它的读取将变得更快,并且它将赶上前面的线程。