我可以使以下代码锁免费/原子吗?

Can I make the following code lock free / atomic?

本文关键字:免费 可以使 代码 我可以      更新时间:2023-10-16

int val = memLoc[index++];

或者更好

int val = memLoc[index++ & 0xFF];

尝试从共享环形缓冲区进行线程安全读取,其中每个调用都会获得下一个值 - 如果可能的话,我希望它能够解锁,因为它发生在 TON。 无增强/C++ 11 允许:(

这里唯一需要同步的操作是index值的递增。 由于这只是一个数值,因此可以通过原子增量在不使用锁的情况下完成。 列出的其余操作只是对共享位置的读取,不需要同步。

在 Win32 上,通过 InterlockedIncrement 函数同步

增量
int oldValue = InterlockedIncrement(&index);
int val = memLoc[oldValue & 0xFF];

Linux 上提供了各种同步增量函数。 关于这个堆栈溢出线程上的选项有一个相当好的讨论

  • 如何在 x86、arm、GCC 和 icc 上运行的 Linux 上执行原子操作?

您需要在原子操作中递增和回读索引。 不幸的是,++ 运算符不保证任何原子性。

大多数处理器都有某种可以使用的获取-增量-存储指令。 您可以插入内联程序集来执行此操作。 http://en.wikipedia.org/wiki/Fetch-and-add

如果你在Windows上运行,MS提供了一个API来访问这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx

如果您使用的是其他操作系统,则可能会有类似的功能。 但无论如何,您都需要操作系统或较低类型的访问权限才能获得原子获取增量存储。