[英]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.