InterlockedAdd on R32_Sint 负数

InterlockedAdd on R32_Sint with negative number

我正在使用 InterlockedAdd 写入 RWBuffer<int> - 最初我有一个 RWBuffer<uint> 但有时我需要我的值变为负值。

我发现使用 InterlockedAdd 传递一个负数不会更新底层的 int 缓冲区 - 我通过对传入的值使用 abs() 来测试它,它起作用了。

我意识到使用 Add 方法添加负数可能看起来像“doh !你期望什么”但是没有 InterlockedSubtract() 所以 ...

这是一个已知问题吗,我只是还没找到相关文档,或者您通常会期望 InterlockedAdd(-1) 像我一样从 RWBuffer<int> 中减去 1?

我不确定类型化缓冲区如何处理原子,但它们肯定适用于结构化缓冲区。

在您的情况下,由于类型化缓冲区是 R32,因此它可以完美地映射到 int 结构化缓冲区。

语法为:

RWStructuredBuffer<int> OutputBuffer : register(u0);

那么互锁操作就像(例如,如果你想将它应用于第二个元素):

uint idx = 1;
uint current_value;
InterlockedAdd(OutputBuffer[idx],-1,current_value);

缓冲区的创建略有不同,但变化并不复杂(需要设置结构化标志并设置元素步幅,在这种情况下为 4)。