一个线程对UINT64 val,作val++操作,另一个线程读取val,是否有可能读取到“脏数据”?

解决方案 »

  1.   

    有可能,val++不是一个原子操作
      

  2.   

    上面说的对,用原子操作就不会了。
    val=InterlockedIncrement64(val);
      

  3.   

    大家回答的太简单,我知道val++不是原子操作。但并不一定影响读取的值。谁能从汇编的角度分析一下啊!!
      

  4.   

    我说个情形:
    一个固定的线程执行;
     现假设: val=1, 执行val++操作,一半时停止。
    另一个线程执行:
     UINT64 n = val; 只要n为1或2,就不算脏数据。 n的值有没有可能为1,2以外的其它值哪?
    请高手详细分析一下?
      

  5.   

    如果是多核或超线程cpu,有可能多个线程同时运行,就不存在线程切换。这种情况下还安全吗?
      

  6.   

    应该是这样的:
    在32位系统中读写INT或UINT是安全的。
    而UINT64在32位系统中读写需要执行2次汇编指令,如果在指令执行中进行线程切换,你就会读到脏数据。val++
    32位系统中是:
    1.读val低位到ECX
    2.读val高位到EDX
    3.执行INC指令
    4.回写val低位
    5.回写val高位