一个线程是对变量只读,另一个线程对变量只写,这两个线程需要同步吗?

rcbblgy 2011-11-03 05:52:43
一个BOOL变量,用来让工作线程自己退出的。

工作线程每次循环都会判断这个变量,决定是退出循环还是继续。

主线程在需要工作线程停止时改变这个变量的值,让工作线程自己退出。

这两个线程需要同步吗
...全文
855 16 打赏 收藏 转发到动态 举报
写回复
用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函数。所以,不用加锁也可以吧。
  • 打赏
  • 举报
回复
可能会读到脏数据
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
  • 打赏
  • 举报
回复
理论上需要同步

15,471

社区成员

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

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