社区
进程/线程/DLL
帖子详情
一个线程是对变量只读,另一个线程对变量只写,这两个线程需要同步吗?
rcbblgy
2011-11-03 05:52:43
一个BOOL变量,用来让工作线程自己退出的。
工作线程每次循环都会判断这个变量,决定是退出循环还是继续。
主线程在需要工作线程停止时改变这个变量的值,让工作线程自己退出。
这两个线程需要同步吗
...全文
855
16
打赏
收藏
一个线程是对变量只读,另一个线程对变量只写,这两个线程需要同步吗?
一个BOOL变量,用来让工作线程自己退出的。 工作线程每次循环都会判断这个变量,决定是退出循环还是继续。 主线程在需要工作线程停止时改变这个变量的值,让工作线程自己退出。 这两个线程需要同步吗
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
smwhotjay
2011-11-04
打赏
举报
回复
mjx1981
2011-11-04
打赏
举报
回复
应该是变量的多线程安全性问题, 读写前要对这个变量加保护.
「已注销」
2011-11-04
打赏
举报
回复
你要是不要求很严格,就问题不大,因为就像你说的,多循环一次无所谓,但是你要是用于自选锁,可能会锁不住。
mozimozillllll
2011-11-04
打赏
举报
回复
需要同步
rcbblgy
2011-11-04
打赏
举报
回复
《Windows核心编程》上介绍原子锁时,有这样一段话
[Quote]
没有哪个Interlocked函数可以仅用来读取一个值(但又不修改它),这是因为这样的功能没有必要。如果线程只需要读取一个值的内容,而这个值始终是通过Interlocked函数修改的,那么读到的值不会有任何问题。虽然我们并不知道读到值的原始值还是更新后的值,但我们知道它肯定是其中之一。对大多数应用程序来说,这已经足够了。
[/Quote]
对于我目前的情况,因为只有一个线程会修改变量,所以不需要Interlocked函数。所以,不用加锁也可以吧。
写不动代码的人
2011-11-03
打赏
举报
回复
可能会读到脏数据
alexander_david
2011-11-03
打赏
举报
回复
http://topic.csdn.net/u/20101217/14/05CB2E93-03E9-4F77-BE65-9241393C1DF3.html
参考这个链接。
这个链接说:
32位CPU与内存的最小交换数据为4字节/次,这也是结构体要对齐4字节的原因。在物理上,CPU对于同一4字节的内存单元,不可能写2个字节的同时,又读了3字节。
感觉他的意思就是,内存访问一次,最小是4个字节,如果公共变量的长度小于或等于这个长度,那么是不会被中断的。
但是从理论上讲,最好还是加。加个临界区好了,开销又不大。
rcbblgy
2011-11-03
打赏
举报
回复
[Quote=引用 7 楼 wltg2001 的回复:]
引用 4 楼 rcbblgy 的回复:
可能的错误情况就是两种:
1、工作线程读这个变量刚读一半,系统把时间片给主线程了,主线程改写变量后,工作线程再来读
2、与1相反,主线程改写变量进行一半,工作线程读取变量值。
这两种情况都不会有问题产生吧。
当然有问题,比如,一个线程正在写时中断了,另一个进程来读,由于写被中断,所以读到的还是旧数据。
[/Quote]
那对于我的这种情况,线程无非就是多循环一次,也不算问题。
rcbblgy
2011-11-03
打赏
举报
回复
[Quote=引用 6 楼 jennyvenus 的回复:]
理论上需要,但是如4楼所说,有没有读到一半就切掉这种情况,俺脚着没有。
[/Quote]
就算读到一半就被切,问题也不大吧。
对于一个BOOL值来讲,我关心它是0还是非0,读到一半被切,结果也仍是这两种情况,就算读错,无非就是多循环一次罢了。写到一半被切也一样是多循环一次。
wltg2001
2011-11-03
打赏
举报
回复
[Quote=引用 4 楼 rcbblgy 的回复:]
可能的错误情况就是两种:
1、工作线程读这个变量刚读一半,系统把时间片给主线程了,主线程改写变量后,工作线程再来读
2、与1相反,主线程改写变量进行一半,工作线程读取变量值。
这两种情况都不会有问题产生吧。
[/Quote]
当然有问题,比如,一个线程正在写时中断了,另一个进程来读,由于写被中断,所以读到的还是旧数据。
用户 昵称
2011-11-03
打赏
举报
回复
理论上需要,但是如4楼所说,有没有读到一半就切掉这种情况,俺脚着没有。
mayudong1
2011-11-03
打赏
举报
回复
赋值和判断大约都不是原子操作
可能一个线程赋值还没有完成,另一个恰好在这时候做判断,这时结果就不一样
导致一个线程去释放资源了,另一个线程还要使用资源
rcbblgy
2011-11-03
打赏
举报
回复
可能的错误情况就是两种:
1、工作线程读这个变量刚读一半,系统把时间片给主线程了,主线程改写变量后,工作线程再来读
2、与1相反,主线程改写变量进行一半,工作线程读取变量值。
这两种情况都不会有问题产生吧。
rcbblgy
2011-11-03
打赏
举报
回复
这种情况下不同步,理论上会有什么可能的错误?
wltg2001
2011-11-03
打赏
举报
回复
要的,如果只有读,没有写,那么可以不用同步。
mayudong1
2011-11-03
打赏
举报
回复
理论上需要同步
JAVA多
线程
精讲下
线程
的
同步
(
线程
安全问题)l
线程
的死锁l
线程
间通信l
线程
组l
线程
池l 多
线程
的第三种实现方案l 匿名内部类方式使用多
线程
l 定时器的使用l 多
线程
面试题
单
线程
读单
线程
写
一个
变量
是否一定要加锁
单
线程
读单
线程
写
一个
变量
是否
需要
加锁,刚毕业的时候我会有这样的想法:
一个
线程
只读
并没有改变
变量
的值并不会有
两个
线程
同时
写
一个
变量
产生竞态,所以不用加锁,但是工作中长者给我指导都是多
线程
必须加锁,所以我也没有深究这个问题,从来没有想过为什么。 过了一段时间后,了解到原子性这个概念,了解到虽然
一个
线程
读
一个
线程
写
,但是因为对
一个
线程
的
写
和读并非是原子的,读
线程
可能读到另外
一个
线程
写
到一半的值...
线程
-
线程
同步
我们知道
线程
共享同一进程内的资源。如果每个
线程
使用的
变量
,其他
线程
都不会读取个修改,那么就不存在一致性问题。相同的,如果
变量
只读
,多个
线程
同时读取该
变量
也不会存在一致性问题。但是,当
一个
线程
可以修改
变量
,其他
线程
可以读取或修改
变量
,那么就要对这些
线程
进行
同步
,确保多个
线程
访问数据安全,不会访问到无效数据。
两个
或多个
线程
同时修改同一
变量
时,也
需要
同步
。跟前面信号讲的问题相同,考虑增量操作情况。增量
C++多
线程
编程:
线程
同步
前言 多
线程
编程必须要考虑
线程
同步
问题。
线程
同步
就是,当多个
线程
共享
一个
内存的时候,为了保证他们都有一致的数据视图。如果每个
线程
使用的
变量
都是其他
线程
不会读取和修改的,那么就不存在一致性问题。同样的,如果
变量
是
只读
的,多个
线程
同时读取该
变量
也不会有一致性问题;但是,当
一个
线程
可以修改的
变量
,其他
线程
可以读取或者修改的时候,我们就
需要
对这些
线程
进行
同步
,确保它们在访问
变量
的存储内容的时候不会访问到...
变量
线程
安全分析
一、成员
变量
和静态
变量
是否
线程
安全? 一、如果他们没有共享,则
线程
安全。 二、如果他们被共享了,根据他们的状态是否能够改变分为两种: 1、如果
只读
,则
线程
安全。 2、如果有读
写
操作,则这段代码时临界区,
需要
考虑
线程
安全 二、局部
变量
是否
线程
安全? 一、局部
变量
是
线程
安全的 public static void test1() { int i = 10; i++;//成员
变量
进行++操作时才会有多个步骤,而局部
变量
没有,他是原子性的 } 每个
线程
调用 test1() 方法时局部
变量
i
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章