原子比较C中两个整数的最快方法?

bro*_*sbp 9 c caching atomic bit

uint64_t n;      // two 32-bit integers

return ( (uint32_t)(n >> 32) == (uint32_t)n );
Run Code Online (Sandbox Code Playgroud)

将32个最高有效位与uint64_t的32个最低有效位进行原子比较的最快方法是什么?

我认为一个可怕的解决方案是:获取自旋锁,读取32 LSB,读取32 MSB,比较得到结果,释放自旋锁,返回结果.有没有办法做到这一点,而不必采取螺旋锁?

Eli*_*ser 9

如何在两个不同的地址上使用比较交换操作?

像:( CMPXCHG (int*)&n, (((int*)&n)+1)注意 - 这实际上不起作用).

编辑:将语法更改为更接近实际的x86语法.

编辑2:正如Serge指出的那样,大多数程序集都不支持在汇编指令中使用两个内存地址,因此这种方式不能直接从内存中工作.这意味着该方法不能用于以原子方式比较64位变量的两个32位部分.

一些程序集(至少是PowerPC)能够提供特殊指令(对于PowerPC,LWARX和STWCX),可以使它以多线程安全的方式工作,但它不是OP所要求的,也不适用于x86 .

  • 请注意,在大多数汇编程序(包括x86)中,没有指令可以在单个指令中使用两个不同的内存地址.因此,"在两个不同的地址上使用比较交换操作"的整个想法不起作用,因为无法在大多数体系结构上以原子方式实现. (3认同)
  • @brooksbp:正如Serge所说,这个答案是完全错误的,不应该是公认的答案.您可能还想重新考虑您的实现,因为它可能不像您想象的那样原子地工作. (3认同)
  • 你不需要做`+ 1`而不是`+ sizeof(int)`吗? (2认同)

R..*_*R.. 7

这整个操作(内存中两个值的原子比较)是没有意义的,除非你还能确保写它们总是原子的.它也受到固有的竞争条件的影响; 当你确定他们是平等的时候他们可能已经改变了,反之亦然.无论你想要解决的问题几乎肯定都需要锁定,而不是原子操作.