5

int val = memLoc[index++];

或者更好

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

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

4

2 回答 2

7

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

InterlockedIncrement在 Win32 上,使用函数完成增量同步

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

Linux 上有各种可用的同步增量函数。关于这个stackoverflow线程上的选项有一个相当好的讨论

于 2012-04-13T14:35:02.793 回答
1

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

大多数处理器都有某种可以使用的 fetch-increment-store 指令。您可以插入内联程序集来做到这一点。 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

如果您在另一个操作系统上,可能会有类似的功能。不过,无论如何,您都需要操作系统或更低类型的访问权限才能获得原子的 fetch-increment-store。

于 2012-04-13T14:41:50.987 回答