大家请看一下下面这段代码。在多个线程中循环调用如下类似的文件操作代码,但每个线程都对单独的文件进行操作,运行一段时间后抛出两个异常:(1)shareviolation;(2)FileNotFound.然后每个线程的文件都不能进行读些。
for(i=0;i<3;i++)
{
m_pFileCurrent->Close();//CFile* pFileCurrent
m_pFileCurrent->GetStatus(m_FileStatus);//CFileStatus m_FileStatus
m_FileStatus.m_ctime = m_tmFisrtGopGet ;//modify time
m_FileStatus.m_mtime = m_tmCurrentBlock;
m_FileStatus.m_atime = m_FileStatus.m_mtime;
m_pFileCurrent->SetStatus((LPCTSTR)m_szFileName,m_FileStatus);
m_nCounter = 0;
m_pFileCurrent->Open(m_szFileName, CFile::modeRead | CFile::modeWrite );
m_pFileCurrent->SeekToEnd();
}

解决方案 »

  1.   

    是不是你的程序先关闭了文件又进行操作?
    //example for CFile::GetStatus
    CFileStatus status;
    extern CFile cfile;
    if( cfile.GetStatus( status ) )    // virtual member function
       {
          #ifdef _DEBUG
             afxDump << "File size = " << status.m_size << "\n";
          #endif
       }
    char* pFileName = "test.dat";
    if( CFile::GetStatus( pFileName, status ) )   // static function
       {
          #ifdef _DEBUG
             afxDump << "Full file name = " << status.m_szFullName << "\n";
          #endif
       }
      

  2.   

    是的,在打开文件的时候应该注意同步,如果两个线程同时按照上面的方式打开同一个文件就会出现第一个错误。第二个错误就不知道了,可能是连锁反应。解决的方法是在打开文件时加参数
    m_pFileCurrent->Open(m_szFileName, 
                         CFile::modeReadWrite|CFile::modeshareDenyNone  
                         );