多进程映射了同一文件,但只进行读操作,有发生冲突的可能吗?
另外多进程在其他什么情况下还有可能冲突,我的多进程程序碰到冲突的问题了,但始终找不到问题在哪,若有大侠能稍微指点一下,提供一些思路,感激不尽

解决方案 »

  1.   

    参考CreateFile
    中的dwShareModeFILE_SHARE_DELETE Windows NT/2000: Subsequent open operations on the object will succeed only if delete access is requested.  
    FILE_SHARE_READ Subsequent open operations on the object will succeed only if read access is requested.  
    FILE_SHARE_WRITE Subsequent open operations on the object will succeed only if write access is requested.  
      

  2.   

    要看你打开文件的方式了,如果是共享读则不会问题。
    还有以下要点:
    1、检查线程间是否有共用了不是线程安全的对象,全部要做互斥处理。
    2、检查线程中使用的所有对象是否存在static类型的,如果是static则会有线程冲突。
    3、线程是否与主线程或UI会有消息机制的通讯,如果有则检查UI里的处理是否存在同步问题。其它的楼下补充
      

  3.   

    coolerhero :读怎么会有冲突呢?
    yjgx007 :映射文件时用的是
    if((hFilemap_dic = OpenFileMapping(FILE_MAP_READ,NULL,"dic")) == NULL)
    {
    hFile_dic=CreateFile(DATA_FILE,
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
    if(hFile_dic == INVALID_HANDLE_VALUE) exit(0);
    dwSize = GetFileSize (hFile_dic, NULL) ;
    hFilemap_dic = CreateFileMapping(hFile_dic,NULL,PAGE_READONLY,0,0,"dic");

    }
    pVoid=MapViewOfFile(hFilemap_dic,FILE_MAP_READ,0,0,0);全都是只读的。
    Crob:是多进程,不是多线程啊
      

  4.   

    在DLL中采用
    #pragma data_seg()
    ...
    #pragma data_seg()
      

  5.   

    char qq[256];
    long len =GetWordItemsword(index,qq);
    qq[len] = '\0';
    //以下是GetWordItemsword的实现代码
    long CSource::GetWordItemsword(int index,char* word)
    {
    long len;
    assert((index>=0) &&(index<=max_Word-1));
    char * curaddr = dic_data + 2*sizeof(long)+cc_NUM*sizeof(WordIndexTable);
    curaddr += *(long*)(aac_indexpt+index*sizeof(long));
    len = *(long*)curaddr;
    curaddr+=3*sizeof(long);
    strncpy(word,curaddr,len);
    return len;
    }就是这个函数过不去,也没有写的操作啊,太郁闷了
      

  6.   

    出什么错?访问了无效内存地址?你这段代码中用到了很多全局或者类成员变量,别人没法看懂,自己调试看一下最后得到的curaddr和len的值是否合理。
      

  7.   

    可以考虑使用内存映射,createfilemapping唯一可以写的进程开启内存映射,其他进程使用openfilemapping,只开启读权限。
      

  8.   

    1.如果多个进程都是你写的,你可以控制读写的,那么:
      A.所有进程都只读这个文件,不写
        不会有共享冲突问题,你可以放心使用,问题一定不是出现在这里.
      B.有一或多个进程会改写这个文件.而且你的进程不关心后来被修改的新内容.
        这时你最好使用内存映射,如果文件不是很多,你就全部读进内存,反正是只读的.所以你后面只不存在共享问题.如果还有其它进程也要读这个内存映射,你就在CreateFileMapping时设置为全局的,这样其它只读的进程要读取时只要OpenFileMapping就可以了.还有一个方法,就是不全部写入内存,但每次在建立内存映射之前复制一个文件副本.这样可以省内存.
      C.有一或多个进程会改写这个文件.而且你的进程也关心后来新修改的内容.
        这时...你要每一个进程都进行共享互斥.否则你可能某次读取的小段内容里,前一半是旧内容,而后一半是新内容.
    2.如果多个进程中有的不是你写的,你不能控制他们的读写的:
      那么你只能用这个方法:
      每次读取内容后都再读一遍,然后比较二次所读的内容,如果一致则采用,否则重新读二遍.以免出现读到一半时另一半被改写的情况.