簡體   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