我想在 x86 平台(保证奔腾或更高版本)上执行和原子读取 64b 对齐的 64b 数据。
有没有办法做到这一点?(不,我不想为此使用关键部分或互斥锁,我希望它是无锁的)。
这个页面描述了如何做到这一点。基本上你只需要使用lock cmpxchg8b
.
使用联锁操作,这里有一些示例代码:
LONGLONG AtomicRead(LONGLONG* p)
{
return InterlockedCompareExchange64(p, 0, 0);
}
这将与零进行比较交换,如果 p 已经等于零,则将 p 设置为零 - 即,这是一个 noop。InterlockedCompareExchange 返回 p 指向的原始 64 位值。
使用 Interlocked*() 函数。
本身没有读取 - 但您可以在添加 0 的位置发出 Add()。