多进程映射了同一文件,但只进行读操作,有发生冲突的可能吗?
另外多进程在其他什么情况下还有可能冲突,我的多进程程序碰到冲突的问题了,但始终找不到问题在哪,若有大侠能稍微指点一下,提供一些思路,感激不尽
另外多进程在其他什么情况下还有可能冲突,我的多进程程序碰到冲突的问题了,但始终找不到问题在哪,若有大侠能稍微指点一下,提供一些思路,感激不尽
解决方案 »
- VC如何实现使用代理访问的功能
- 请问各位大侠,CListCtrl中怎么在右边添加一个滚动条啊?
- 如何取SCSI硬盘物理序列号?
- 请大家帮忙看看我的登录模块错在哪里!
- 如何在单文档的右下角创建两个CTabCtrl标签?
- 谁有防火墙的源代码?(高分伺候)
- VC如何通过串口与 FPGA/CPLD 芯片通信?---急盼高手指导。
- 一个极菜鸟的问题,但是我不知道
- 如何能够在report风格的listview中禁止改变Column的宽度?
- 为什么我的MFC ClassWizard里没WM_NCHITTEST消息?
- openMP程序的部署问题,在线等候~~~~~~~~~~~~~~~~~~~~~~
- 我有一套棋牌网络游戏的源码,但是有点问题解决不了,如果有谁能帮忙解决一下我送一套给他
中的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.
还有以下要点:
1、检查线程间是否有共用了不是线程安全的对象,全部要做互斥处理。
2、检查线程中使用的所有对象是否存在static类型的,如果是static则会有线程冲突。
3、线程是否与主线程或UI会有消息机制的通讯,如果有则检查UI里的处理是否存在同步问题。其它的楼下补充
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:是多进程,不是多线程啊
#pragma data_seg()
...
#pragma data_seg()
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;
}就是这个函数过不去,也没有写的操作啊,太郁闷了
A.所有进程都只读这个文件,不写
不会有共享冲突问题,你可以放心使用,问题一定不是出现在这里.
B.有一或多个进程会改写这个文件.而且你的进程不关心后来被修改的新内容.
这时你最好使用内存映射,如果文件不是很多,你就全部读进内存,反正是只读的.所以你后面只不存在共享问题.如果还有其它进程也要读这个内存映射,你就在CreateFileMapping时设置为全局的,这样其它只读的进程要读取时只要OpenFileMapping就可以了.还有一个方法,就是不全部写入内存,但每次在建立内存映射之前复制一个文件副本.这样可以省内存.
C.有一或多个进程会改写这个文件.而且你的进程也关心后来新修改的内容.
这时...你要每一个进程都进行共享互斥.否则你可能某次读取的小段内容里,前一半是旧内容,而后一半是新内容.
2.如果多个进程中有的不是你写的,你不能控制他们的读写的:
那么你只能用这个方法:
每次读取内容后都再读一遍,然后比较二次所读的内容,如果一致则采用,否则重新读二遍.以免出现读到一半时另一半被改写的情况.