我正在学习关于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
答案 0 :(得分:2)
同一文件的第二次读取将比第一次读取快得多,因为数据已经全部缓存在RAM中。这意味着如果一个线程落后于另一个线程,它的读取将变得更快,并且它将赶上前面的线程。