首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于原子操作,请

2012-08-02 
关于原子操作,请高手指点!如果我有两个线程,一个线程会执行 x++一个线程会执行 x--这种情况应该没什么争

关于原子操作,请高手指点!
如果我有两个线程,
一个线程会执行 x++;
一个线程会执行 x--;
这种情况应该没什么争议,应该把代码修改成原子操作。

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

我认为不用,x无非就是之前的值,或者+n后的值,不会影响我程序的逻辑。
x可能会出现其它乱七八糟的值吗?

[解决办法]
但是你的判断条件if(x - y > z)可能会变化,TRUE或者FALSE,导致你的程序执行的流程也不一样
[解决办法]
需要考虑同步,你这个就是一个线程写,一个线程读,读可能读的是脏数据
[解决办法]
不用原子操作。
[解决办法]
《Windows核心编程》里有这么一句话(大概):“在任何时候读到的都是一个好值”
只不过 if( x - y > z )时也许条件成立,但执行到里面的代码时,条件就不成立了,或者相反
[解决办法]

探讨

因为是多线程,之前判断和之后判断会造成TRUE和FALSE的区别。当然这是我程序逻辑中考虑到的问题,否则可能会用Event来进行同步。

目前我就想知道这样的情况,不用原子操作应该没问题吧?

[解决办法]
这个似乎和x的数据类型有关。

如果x的字节长度小于等于机器字长,例如win32系统,x的长度小于等于4个字节,那么访问x的操作(读或写)是一条机器指令完成的,执行过程中是不会被打断的,因此无论读或写获取的都是完整的值,所以象楼主的情况就可以不加锁。

但是如果x的长度大于机器字长,那么访问的操作可能被中断,假设读写是同时的话,那么读取的x可能就是修改不完全的数值,这个时侯就必须加锁了。

csdn有一篇帖子,说的是这个问题,等会我找找看。
[解决办法]
http://topic.csdn.net/t/20030327/11/1583216.html#r_11407912
可以参考这个网页。
另外一个网页找不到了。

为安全起见,还是加吧。省得出问题的时侯……
[解决办法]
读x本身就是不可中断的,你加锁还不是一样?
[解决办法]
添加一个 volatile
[解决办法]
需要原子操作。
[解决办法]
这个应该不是参数的原子操作的问题了,应该是逻辑的同步互斥了
[解决办法]
想太多没用的 加锁就对了
[解决办法]
多个线程访问同一个资源,是需要同步的。

热点排行