关于原子操作,请高手指点!

xinyi 2012-03-09 07:01:23
如果我有两个线程,
一个线程会执行 x++;
一个线程会执行 x--;
这种情况应该没什么争议,应该把代码修改成原子操作。

我想问下面这种情况是否要进行原子操作:
两个线程,
一个线程会执行 x += n;
一个线程会判断 if( x - y > z ) ...
这种情况是否要修改成原子操作?

我认为不用,x无非就是之前的值,或者+n后的值,不会影响我程序的逻辑。
x可能会出现其它乱七八糟的值吗?
...全文
163 14 打赏 收藏 转发到动态 举报
写回复
用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,导致你的程序执行的流程也不一样

15,471

社区成员

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

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