3

我想在 x86 平台(保证奔腾或更高版本)上执行和原子读取 64b 对齐的 64b 数据。

有没有办法做到这一点?(不,我不想为此使用关键部分或互斥锁,我希望它是无锁的)。

4

3 回答 3

6

这个页面描述了如何做到这一点。基本上你只需要使用lock cmpxchg8b.

于 2009-04-24T21:16:59.133 回答
4

使用联锁操作,这里有一些示例代码:

LONGLONG AtomicRead(LONGLONG* p)
{
    return InterlockedCompareExchange64(p, 0, 0);
}

这将与零进行比较交换,如果 p 已经等于零,则将 p 设置为零 - 即,这是一个 noop。InterlockedCompareExchange 返回 p 指向的原始 64 位值。

于 2009-04-24T21:48:03.523 回答
0

使用 Interlocked*() 函数。

本身没有读取 - 但您可以在添加 0 的位置发出 Add()。

于 2009-04-24T21:16:43.957 回答