社区
进程/线程/DLL
帖子详情
关于原子操作,请高手指点!
xinyi
2012-03-09 07:01:23
如果我有两个线程,
一个线程会执行 x++;
一个线程会执行 x--;
这种情况应该没什么争议,应该把代码修改成原子操作。
我想问下面这种情况是否要进行原子操作:
两个线程,
一个线程会执行 x += n;
一个线程会判断 if( x - y > z ) ...
这种情况是否要修改成原子操作?
我认为不用,x无非就是之前的值,或者+n后的值,不会影响我程序的逻辑。
x可能会出现其它乱七八糟的值吗?
...全文
163
14
打赏
收藏
关于原子操作,请高手指点!
如果我有两个线程, 一个线程会执行 x++; 一个线程会执行 x--; 这种情况应该没什么争议,应该把代码修改成原子操作。 我想问下面这种情况是否要进行原子操作: 两个线程, 一个线程会执行 x += n; 一个线程会判断 if( x - y > z ) ... 这种情况是否要修改成原子操作? 我认为不用,x无非就是之前的值,或者+n后的值,不会影响我程序的逻辑。 x可能会出现其它乱七八糟的值吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tixisong
2012-03-15
打赏
举报
回复
多个线程访问同一个资源,是需要同步的。
Daisy__Ben
2012-03-15
打赏
举报
回复
想太多没用的 加锁就对了
小马喝水
2012-03-14
打赏
举报
回复
这个应该不是参数的原子操作的问题了,应该是逻辑的同步互斥了
吹雪
2012-03-14
打赏
举报
回复
需要原子操作。
Saleayas
2012-03-14
打赏
举报
回复
添加一个 volatile
hotpos
2012-03-14
打赏
举报
回复
读x本身就是不可中断的,你加锁还不是一样?
alexander_david
2012-03-14
打赏
举报
回复
http://topic.csdn.net/t/20030327/11/1583216.html#r_11407912
可以参考这个网页。
另外一个网页找不到了。
为安全起见,还是加吧。省得出问题的时侯……
alexander_david
2012-03-14
打赏
举报
回复
这个似乎和x的数据类型有关。
如果x的字节长度小于等于机器字长,例如win32系统,x的长度小于等于4个字节,那么访问x的操作(读或写)是一条机器指令完成的,执行过程中是不会被打断的,因此无论读或写获取的都是完整的值,所以象楼主的情况就可以不加锁。
但是如果x的长度大于机器字长,那么访问的操作可能被中断,假设读写是同时的话,那么读取的x可能就是修改不完全的数值,这个时侯就必须加锁了。
csdn有一篇帖子,说的是这个问题,等会我找找看。
向立天
2012-03-14
打赏
举报
回复
[Quote=引用 2 楼 xinyi 的回复:]
因为是多线程,之前判断和之后判断会造成TRUE和FALSE的区别。当然这是我程序逻辑中考虑到的问题,否则可能会用Event来进行同步。
目前我就想知道这样的情况,不用原子操作应该没问题吧?
[/Quote]没问题
gg606
2012-03-13
打赏
举报
回复
《Windows核心编程》里有这么一句话(大概):“在任何时候读到的都是一个好值”
只不过 if( x - y > z )时也许条件成立,但执行到里面的代码时,条件就不成立了,或者相反
Dnkuni
2012-03-09
打赏
举报
回复
不用原子操作。
Eleven
2012-03-09
打赏
举报
回复
需要考虑同步,你这个就是一个线程写,一个线程读,读可能读的是脏数据
xinyi
2012-03-09
打赏
举报
回复
因为是多线程,之前判断和之后判断会造成TRUE和FALSE的区别。当然这是我程序逻辑中考虑到的问题,否则可能会用Event来进行同步。
目前我就想知道这样的情况,不用原子操作应该没问题吧?
Eleven
2012-03-09
打赏
举报
回复
但是你的判断条件if(x - y > z)可能会变化,TRUE或者FALSE,导致你的程序执行的流程也不一样
分布式锁实战之SpringBoot实战实现
本课程将介绍分布式架构下、微服务项目分布式锁的实现方式,包括数据库级别锁、基于Redis的
原子操作
、基于Zookeeper的实现、基于Redisson的实现等方式。 在实战完各种方式后,我也分享介绍了两个很实用的实际业务...
java mysql 插入 重复_求
高手
指点
:假如避免java 插入重复的数据(如手机号码),mysql 数据库...
假如一个操作员导入,数据库中已经存在的手机号不让导入,是没有问题的。后面进一步测试:通过多个操作员,通过2个浏览器同时导入同一个excel,看看是不是同一个手机号码只能导入进去一个,结果出问题了,每个号码被...
redis中multi和pipeline区别以及效率(推荐使用pipeline)
手册得知 pipeline 只是把多个redis指令一起发出去,redis并没有保证这些指定的执行是原子的;multi相当于一个redis的transaction的,保证整个操作的原子性,避免由于... 上代码,望
高手
指点
。 <?php...
Diamond软件使用问题集锦
实在想做的完美,可以在解析结构时,使用envi X 2,找出原子X周围较为合理的H,然后将其固定,后者先在Diamond里找出形成氢键D...A的原子对,然后在解析结构时在这两个原子之间加入Dummy,并将Dummy定义为H,然后对H...
漫谈Silverlight(1)封装异步操作
在上一篇的讨论中,有园友提出了Service的粒度问题,我觉得说的很有道理,对于Silverlight的RIA应用,合理的设计Service的接口,控制粒度也是与传统的编程思路有差异的地方,对
原子操作
的合并再发布对于RIA的...
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章