关于原子操作,请
关于原子操作,请高手指点!如果我有两个线程,一个线程会执行 x++一个线程会执行 x--这种情况应该没什么争
关于原子操作,请高手指点!
如果我有两个线程,
一个线程会执行 x++;
一个线程会执行 x--;
这种情况应该没什么争议,应该把代码修改成原子操作。
我想问下面这种情况是否要进行原子操作:
两个线程,
一个线程会执行 x += n;
一个线程会判断 if( x - y > z ) ...
这种情况是否要修改成原子操作?
我认为不用,x无非就是之前的值,或者+n后的值,不会影响我程序的逻辑。
x可能会出现其它乱七八糟的值吗?
[解决办法]
但是你的判断条件if(x - y > z)可能会变化,TRUE或者FALSE,导致你的程序执行的流程也不一样
[解决办法]
需要考虑同步,你这个就是一个线程写,一个线程读,读可能读的是脏数据
[解决办法]
不用原子操作。
[解决办法]
《Windows核心编程》里有这么一句话(大概):“在任何时候读到的都是一个好值”
只不过 if( x - y > z )时也许条件成立,但执行到里面的代码时,条件就不成立了,或者相反
[解决办法]
[解决办法]这个似乎和x的数据类型有关。
如果x的字节长度小于等于机器字长,例如win32系统,x的长度小于等于4个字节,那么访问x的操作(读或写)是一条机器指令完成的,执行过程中是不会被打断的,因此无论读或写获取的都是完整的值,所以象楼主的情况就可以不加锁。
但是如果x的长度大于机器字长,那么访问的操作可能被中断,假设读写是同时的话,那么读取的x可能就是修改不完全的数值,这个时侯就必须加锁了。
csdn有一篇帖子,说的是这个问题,等会我找找看。
[解决办法]http://topic.csdn.net/t/20030327/11/1583216.html#r_11407912
可以参考这个网页。
另外一个网页找不到了。
为安全起见,还是加吧。省得出问题的时侯……
[解决办法]读x本身就是不可中断的,你加锁还不是一样?
[解决办法]添加一个 volatile
[解决办法]需要原子操作。
[解决办法]这个应该不是参数的原子操作的问题了,应该是逻辑的同步互斥了
[解决办法]想太多没用的 加锁就对了
[解决办法]多个线程访问同一个资源,是需要同步的。