如果我有两个线程,
一个线程会执行 x++;
一个线程会执行 x--;
这种情况应该没什么争议,应该把代码修改成原子操作。我想问下面这种情况是否要进行原子操作:
两个线程,
一个线程会执行 x += n;
一个线程会判断 if( x - y > z ) ...
这种情况是否要修改成原子操作?我认为不用,x无非就是之前的值,或者+n后的值,不会影响我程序的逻辑。
x可能会出现其它乱七八糟的值吗?

解决方案 »

  1.   

    但是你的判断条件if(x - y > z)可能会变化,TRUE或者FALSE,导致你的程序执行的流程也不一样
      

  2.   

    因为是多线程,之前判断和之后判断会造成TRUE和FALSE的区别。当然这是我程序逻辑中考虑到的问题,否则可能会用Event来进行同步。目前我就想知道这样的情况,不用原子操作应该没问题吧?
      

  3.   

    《Windows核心编程》里有这么一句话(大概):“在任何时候读到的都是一个好值”
    只不过 if( x - y > z )时也许条件成立,但执行到里面的代码时,条件就不成立了,或者相反
      

  4.   

    这个似乎和x的数据类型有关。如果x的字节长度小于等于机器字长,例如win32系统,x的长度小于等于4个字节,那么访问x的操作(读或写)是一条机器指令完成的,执行过程中是不会被打断的,因此无论读或写获取的都是完整的值,所以象楼主的情况就可以不加锁。但是如果x的长度大于机器字长,那么访问的操作可能被中断,假设读写是同时的话,那么读取的x可能就是修改不完全的数值,这个时侯就必须加锁了。csdn有一篇帖子,说的是这个问题,等会我找找看。
      

  5.   

    http://topic.csdn.net/t/20030327/11/1583216.html#r_11407912
    可以参考这个网页。
    另外一个网页找不到了。为安全起见,还是加吧。省得出问题的时侯……