18 Responses

Page 1 of 1
  1. dzh
    dzh 05/17/2010 at 10:24 · · Reply

    x++可以用汇编来写 : __asm LOCK inc dword ptr[x]
    这样x++只有一条指令。并且是原子操作指令。

  2. Jermery
    Jermery 11/27/2011 at 22:00 · · Reply

    我们会发现最终x的值会是1而不是2,因为Thread 1的结果被覆盖掉了,博主,这句话不是很明白~~请指教~~
    意思是说t1 t2都对x做了++,期望是2,但结果是1 ?

  3. Richard
    Richard 07/31/2012 at 11:43 · · Reply

    Nice. Thanks.

  4. xingchong
    xingchong 11/17/2012 at 12:16 · · Reply

    很不错的文章; 早点看到会跟好;
    之前调过一个bug; 相邻的两个bitfield用了两把锁分别保护, 结果就悲剧了;

  5. andy xie
    andy xie 01/22/2013 at 19:51 · · Reply

    关于第二个问题“2. 对Bit field(位域)的读写操作是否是线程安全的?”,有点疑问。第二个问题中给出的例子,到底出现什么情况才会出现线程不安全,能不能给具体解释一下。

    1. Tony Jin
      Tony Jin 04/23/2013 at 13:33 · · Reply

      假设位域是:
      struct foo {
      int flag : 1;
      int counter : 15;
      };
      对flag或者counter的读写并不是一个单独的指令就能完成的,而是要经过很多个步骤,才能从一个字(16位)里面解析出flag和counter,计算过程中需要寄存器作为中间值,如果多个线程同时做访问,必然会导致数据的混乱,可以写如下代码,然后反汇编看看就知道了:
      foo f;
      f.flag = 1;
      f.counter = 1;
      GoodLuck:)

  6. mordorw
    mordorw 04/18/2013 at 14:27 · · Reply

    x++如果有三条指令,你用硬件的lock前缀搞的定么?恐怕要用软件锁了

    单个指令也无法保证原子性,单个指令才用硬件的lock前缀搞定

    x++可以用汇编来写 : __asm LOCK inc dword ptr[x]
    这样x++只有一条指令。并且是原子操作指令

  7. Tony Jin
    Tony Jin 04/23/2013 at 11:40 · · Reply

    你好,你的这篇文章让我获益匪浅,但有以个疑问:
    16-bit accesses to uncached memory locations that fit within a 32-bit data bus(未缓存且在32位数据总线范围之内的内存地址的访问)
    我的理解是假设有一个地址X是32位对齐的,那么如果我要访问X+8~X+24,这16位的数据,虽然X+8不是16位对齐的,但没有越过这个32位边界,所以是有原子保证的,请问我的理解是否正确?如果不正确,能否说明一下,感谢万分:)

Leave a Reply