uint64_t n; // two 32-bit integers
return ( (uint32_t)(n >> 32) == (uint32_t)n );
以原子方式比较 uint64_t 的 32 个最高有效位和 32 个最低有效位的最快方法是什么?
我认为一个可怕的解决方案是:获取自旋锁,读取 32 LSB,读取 32 MSB,比较以获得结果,释放自旋锁,返回结果。有什么办法可以做到这一点而不必使用自旋锁吗?
最佳答案
如何对两个不同的地址使用比较交换操作?
类似于:CMPXCHG (int*)&n, (((int*)&n)+1)
(注意 - 这实际上行不通)
编辑:将语法更改为更接近实际的 x86 语法。
编辑 2: 正如 Serge 所指出的,大多数程序集不支持在汇编指令中使用两个内存地址,因此这种方式不能直接从内存中工作。这意味着这种方法不能用于以原子方式比较 64 位变量的两个 32 位部分。
一些程序集(至少是 PowerPC)能够提供特殊指令(对于 PowerPC、LWARX 和 STWCX),可以使它以多线程安全的方式工作,但这并不是 OP 所要求的,也不会为 x86 工作。
关于c - 在 C 中以原子方式比较两个整数的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6482485/