c - 在 C 中以原子方式比较两个整数的最快方法?

标签 c caching atomic bit

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/

相关文章:

c - 在 C 中的 linux 上如何生成大小为 X 的文件?

c - 从 C++ 程序中使用 C 函数 - extern 关键字问题

android - 为什么我的缓存机制没有按预期工作?

caching - Yii 是否缓存外部 javascript 文件和 CSS 文件?

c++ - 具有 volatile 原子变量的原子操作

java - 有没有办法等待原子整数的变化

c - 为什么此代码会导致浮点异常 - SIGFPE

在 system() 之后 close() 奇怪的行为

Laravel:文件在路径.../缓存中不存在

c++ - 如何正确使用 std::atomic_signal_fence()?