多个线程从相同的内存地址同时读数据

副组长 2013-08-09 08:41:12
在置顶贴里跟帖没人理呢,单开一贴,放点分分,反正我的分也没啥用。来者有分!
议题是:多个线程从相同的内存地址同时读数据,不加锁,是否确定不会产生脏数据?
注意是“读”,不是读写。一般对这个问题是怎么讲的?
还有,如果内存是共享内存映射会是神马情况?
...全文
663 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-08-15
  • 打赏
  • 举报
回复
假设一次,写512字节 如果你的写程序比较快 你的读程序比较慢 现在正在读第128字节 写就开始了 在某个阶段写数据的位置,超过读数据的位置。 假设是在256字节以后 那么你的读程序,读到的数据,前n~256字节是旧数据(n<128),后256~m字节是新写入的数据。 你这一批数据,明显是不一致的。肯定是脏数据无疑了。 读和写之间要加锁,这是必然的。 读程序之间可以不必加锁。 读写锁大概就是这么来的。
woshinia 2013-08-14
  • 打赏
  • 举报
回复
引用 22 楼 gordon3000 的回复:
[quote=引用 19 楼 woshinia 的回复:] 如果只是读的话,肯定不会有问题啊,地址和内存数据又不会变,线程中的几个用于读的扫描指针又不会相互影响。 内存映射也是同理。线程的问题其实大多数书上都有经典做法。 其实不如问多进程同时访问同一个文件的问题,怎么做进程间的读写锁?
多进程存取文件已经有非常完善的机制了吧。比方大家都读文件,用CFile::shareDenyNone就不会出问题。[/quote] 设置了这个标志的话只是说如果发生冲突了,打开会失败。但读写锁的意思是,如果有写的需求,但正有进程在读,那么就要防止再有其他读进程进入,并且等待当前的读进程释放读的锁后马上进入文件的操作。CFile::shareDenyNone这些即使用while循环去等待,也不能保证这个执行的逻辑顺序。
tianxiadiyishuai 2013-08-14
  • 打赏
  • 举报
回复
按楼主意思,就是没问题的
lgstudyvc 2013-08-12
  • 打赏
  • 举报
回复
光读,没问题,类似转发
oyljerry 2013-08-12
  • 打赏
  • 举报
回复
如果光是读,那应该没什么问题。也不需要加锁
baichi4141 2013-08-12
  • 打赏
  • 举报
回复
写的时候是锁着的,读的时候没锁,那你这个写的锁锁的是啥? 如果你用其他机制保证了写的时候不会读,那也是广义的锁
副组长 2013-08-10
  • 打赏
  • 举报
回复
引用 19 楼 woshinia 的回复:
如果只是读的话,肯定不会有问题啊,地址和内存数据又不会变,线程中的几个用于读的扫描指针又不会相互影响。 内存映射也是同理。线程的问题其实大多数书上都有经典做法。 其实不如问多进程同时访问同一个文件的问题,怎么做进程间的读写锁?
多进程存取文件已经有非常完善的机制了吧。比方大家都读文件,用CFile::shareDenyNone就不会出问题。
快乐鹦鹉 2013-08-09
  • 打赏
  • 举报
回复
自己完全可以编写测试程序来验证的。权威上哪里找啊。自己的证据才是权威
副组长 2013-08-09
  • 打赏
  • 举报
回复
大多数回答都是应该没问题,呵呵,这个应该有点含糊呢。 不知道权威的说法是咋样的。
副组长 2013-08-09
  • 打赏
  • 举报
回复
引用 7 楼 VisualEleven 的回复:
[quote=引用 4 楼 gordon3000 的回复:] 不,光读。写的时候锁定写好的,读的时候大家一起读。
你的读和写是会同时操作吗?[/quote] 不同时,写时是按照规范的办法,加锁,写好了就不动了。然后解锁。 读的时候没有锁大家都来随便读。10楼、13楼说的就是我的意思。 有说对同地址内存的读有排队机制,没问题。也有说有缓存中更新问题可能有脏数据。 怎么试验不加锁的多线程读都没有遇到数据出错,就是想确认一下这种不锁只读可靠不?涉及到效率。
神-气 2013-08-09
  • 打赏
  • 举报
回复
引用 13 楼 zhousitiaoda 的回复:
俺觉得楼主的意思应该是先写,写时加锁,写完后大家一起读(此后不再写),读的时候不加锁。如果同时读写那肯定是要加锁的,楼主应该也不会问这么低级的问题。
如果不是这个问题的话,我觉得就没什么问题了。。 捡分。
副组长 2013-08-09
  • 打赏
  • 举报
回复
写的时候是锁着的。
zhousitiaoda 2013-08-09
  • 打赏
  • 举报
回复
俺觉得楼主的意思应该是先写,写时加锁,写完后大家一起读(此后不再写),读的时候不加锁。如果同时读写那肯定是要加锁的,楼主应该也不会问这么低级的问题。
smwhotjay 2013-08-09
  • 打赏
  • 举报
回复
快乐鹦鹉 2013-08-09
  • 打赏
  • 举报
回复
你只在写的时候加锁,读的时候不加锁,这把锁就和没有一样。 你说的写的时候加锁,指的是有许多写的处理,它们之间加锁吧? 这应该是不够的,读的时候也要加锁,这个锁是针对写的,不是针对各个读处理的 读和写这两种状态要加锁
xiaohutushen30 2013-08-09
  • 打赏
  • 举报
回复
看来要读之前写好,写一次永久性的读,应该不会出问题!
gg606 2013-08-09
  • 打赏
  • 举报
回复
感觉还是没说清楚!这应该是经典的问题,楼主怎么保证写的时候读线程不去读取?
zhousitiaoda 2013-08-09
  • 打赏
  • 举报
回复
都只读我觉得应该没必要,内存映射在映射时就已经读取完了,如果在映射时同时有读写操作,貌似有个写时复制的机制吧,还是坐等高手来一针见血
孤客天涯 2013-08-09
  • 打赏
  • 举报
回复
引用 4 楼 gordon3000 的回复:
不,光读。写的时候锁定写好的,读的时候大家一起读。
既然有读有写,光写的时候加锁没用,如果写与读同时进行就可能会有问题。
Eleven 2013-08-09
  • 打赏
  • 举报
回复
引用 4 楼 gordon3000 的回复:
不,光读。写的时候锁定写好的,读的时候大家一起读。
你的读和写是会同时操作吗?
加载更多回复(8)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧