我有同一进程的不同线程(所以地址空间是一样的)中CreateFileMapping了二个以上不同的文件,CreateFileMapping调用成功,但读指针移动时出错(二个以上的线程同时在读,但文件是不同的)请问,一个进程是否不能同时打开多个文件映射??

解决方案 »

  1.   

    线程不必做互斥,因为彼此资源是独立的,没有临界区。
    线程代码(包括创建文件映射)如下:DWORD WINAPI PlayFileProc(void *p)
    {
    CMediaStream *pMedia = (CMediaStream*) p; unsigned char *pData;// = pMedia->m_pFileBuf + AVI_HEAD_SIZE; //pfh = (FrameHead*) pData; DWORD vfn = 0, afn = 0;
    MediaHead mh;   pMedia->m_hFile = CreateFile(pMedia->m_sFileName, 
    GENERIC_READ|GENERIC_WRITE,
    0,
    NULL,
                          OPEN_EXISTING, 
                          FILE_ATTRIBUTE_NORMAL, 
                          NULL); if (pMedia->m_hFile == INVALID_HANDLE_VALUE){ return FALSE;
    }

    DWORD dwFileSize = GetFileSize(pMedia->m_hFile,  NULL);
    HANDLE hMapFile;
    hMapFile = CreateFileMapping(pMedia->m_hFile, // current file handle
                            NULL, // default security
                            PAGE_READWRITE, // read/write permission
                            0,  // size of mapping object, high
                            dwFileSize, // size of mapping object, low
                            NULL); // name of mapping object
    if (hMapFile == NULL) {
    return FALSE;
    } unsigned char *lpMapAddress;
    lpMapAddress = (unsigned char *)MapViewOfFile(hMapFile, // handle to mapping object
    FILE_MAP_ALL_ACCESS, // read/write permission 
    0, // high-order 32 bits of file offset
    0, // low-order 32 bits of file offset
    dwFileSize); // number of bytes to map if (lpMapAddress == NULL) {
    return FALSE;
    }

    if(strncmp((char*)lpMapAddress, "RIFF", 4))
    {
    MessageBox(NULL, "Not valid AVI File", "Error", MB_OK);
    return FALSE;
    }
    pData = lpMapAddress +  AVI_HEAD_SIZE; pMedia->m_pFileBuf = lpMapAddress; AVIHead *pAVIHead = (AVIHead*)pMedia->m_pFileBuf; pMedia->m_nVideoFrames = pAVIHead->nVideoFrames; DWORD m_dwPlayFileID; while (vfn < pMedia->m_nVideoFrames)
    {
    pfh = (FrameHead*)pData;
    pData += 8;
    if ( pfh->sType[0] == '0' && pfh->sType[1] == '0' && pfh->sType[2] == 'd')
    {
    // 视频部分 }
    else if ( pfh->sType[0] == '0' && pfh->sType[1] == '1' && pfh->sType[2] == 'w')
    {
    //音频部分

    }
    else 
    {           // exception 处理
    }

    if ((pfh->dwLen&3))
    MessageBox(NULL, "len error", "AVI Error", MB_OK); pData += pfh->dwLen;



    }
    return TRUE;
    }
      

  2.   

    果然是地址重叠了:一个是0x6d5 0000,第二个是0x71e 0000
    这两个相差0x49 0000 < 1M,而我的文件全是大于1M的,那肯定重叠了!