数据互斥问题(多线程编程技术)

bailee 2011-06-12 12:35:19
几个线程(或进程)在对一个变量操作时,是需要保护的,这点大家都知道。

我的问题是:

1、多线程都只是在读同一变量,这个也需要保护吗?

2、如果只有一个线程是写变量的线程,其他线程都只是读,这种情况怎么处理最好?是否也不需要保护?


阿笨一贯主张:关注也给分!!!
...全文
215 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
bailee 2011-06-15
  • 打赏
  • 举报
回复
请再一次关注一下,谢谢
ryfdizuo 2011-06-15
  • 打赏
  • 举报
回复
阿笨,需要找本操作系统书看,谢谢!
天外来客-007 2011-06-13
  • 打赏
  • 举报
回复
只读属性无需保护,而涉及到写的属性则需要保护,具体的请参照操作系统相关知识!
yyg990441 2011-06-12
  • 打赏
  • 举报
回复
1、多线程都只是在读同一变量,这个也需要保护吗?

不需要

2、如果只有一个线程是写变量的线程,其他线程都只是读,这种情况怎么处理最好?是否也不需要保护?

如果该变量很简单,比如是个整数,那么应该使用原子操作
如果读变量线程读变量后进行了较长时间的操作,那么应该用读写锁(读线程加读锁,写线程加写锁)
否则,简单期间,对任意线程中对该变量的读写处均用临界区包围起来。
relive007 2011-06-12
  • 打赏
  • 举报
回复
只读不写,是不需要保护的。但是有写有读的时候,不管是读还是写都需要保护,就是读的时候也要进行保护。
liutengfeigo 2011-06-12
  • 打赏
  • 举报
回复
你想到的,书上都有.
龙行天下之Sky 2011-06-12
  • 打赏
  • 举报
回复
1、多线程都只是在读同一变量,这个也需要保护吗?
这个不需要保护
2、如果只有一个线程是写变量的线程,其他线程都只是读,这种情况怎么处理最好?是否也不需要保护?
这个只需要在写变量的线程里保护就可以了


C++中如果是内置类型变量的话,可以用关键字volatile来进行修饰就可以了
如果是自定义变量,则在写的现场中进行保护就可以了
vcf_reader 2011-06-12
  • 打赏
  • 举报
回复
其实亲自动手测试是最好的办法
lj10193019 2011-06-12
  • 打赏
  • 举报
回复
关注一下!
学习了!
东莞某某某 2011-06-12
  • 打赏
  • 举报
回复
加锁/关键代码段 速度相当不错了,那么多读线程,为了安全,建议使用。
bailee 2011-06-12
  • 打赏
  • 举报
回复
8楼的正解。
偶不是不会加锁,加锁时程序的效率不高,这就是我考虑的。

不过最后的结果是:在速度与正确性上,我选择了速度。

原因:只是偶尔写一次,整个程序过程中,都可能只写两三次,而读操作,却是几万次。
更重要的是:这程序是LSP程序,是过滤数据的,如果太慢,那其他程序就有可能假死在那里。

所以想了解一下,在一写多读时,如果不加锁,都会出哪些问题?
继续等待其他建议......

hengshan 2011-06-12
  • 打赏
  • 举报
回复
你要明白一点就是,两个不同线程可见的资源才需要保护的。

问题一:
不需要保护

问题二:
必须要在读资源、写资源的地方都进行保护,方法可以用“读、写锁”
wangsifu2009 2011-06-12
  • 打赏
  • 举报
回复
总结楼上的,基本就成正解了
yyg990441 2011-06-12
  • 打赏
  • 举报
回复
"我只是小小的修改了一个DWORD值"
显然用原子操作啊
CZQing_ze 2011-06-12
  • 打赏
  • 举报
回复
其实i我是来关注的。。。。
qq120848369 2011-06-12
  • 打赏
  • 举报
回复
Linux有读写锁,专门解决共享读,独占写的问题。

maoxing63570 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bailee 的回复:]
谢谢大家,呵。
第一个问题解决。

第二个问题升级:如果是一写多读,又不做保护,有何结果?
1、写成功,读也是读的改变后的值;
2、写成功,正在读的读原值,后面再来读的读新值;
3、写不成功,出现读写冲突。

我只是小小的修改了一个DWORD值,呵,本人担心的是第三种情况。
[/Quote]
在正确性与速度之间还是选择正确性吧,加锁吧
bailee 2011-06-12
  • 打赏
  • 举报
回复
谢谢大家,呵。
第一个问题解决。

第二个问题升级:如果是一写多读,又不做保护,有何结果?
1、写成功,读也是读的改变后的值;
2、写成功,正在读的读原值,后面再来读的读新值;
3、写不成功,出现读写冲突。

我只是小小的修改了一个DWORD值,呵,本人担心的是第三种情况。
ryfdizuo 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 bailee 的回复:]
几个线程(或进程)在对一个变量操作时,是需要保护的,这点大家都知道。

我的问题是:

1、多线程都只是在读同一变量,这个也需要保护吗?

2、如果只有一个线程是写变量的线程,其他线程都只是读,这种情况怎么处理最好?是否也不需要保护?


阿笨一贯主张:关注也给分!!!
[/Quote]
找本操作系统书看一下吧,补充一下基础知识。
ryfdizuo 2011-06-12
  • 打赏
  • 举报
回复
1、多线程都只是在读同一变量,这个也需要保护吗?
==========
同时读取没有关系的。。。

2、如果只有一个线程是写变量的线程,其他线程都只是读,这种情况怎么处理最好?是否也不需要保护?
===========
有读有写,该变量就是临界资源,需要互斥访问,具体方法有临界区,信号量,互斥锁。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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