int val = memLoc[index++];
或者更好
int val = memLoc[index++ & 0xFF];
尝试从共享环形缓冲区进行线程安全读取,每次调用都会获得下一个值 - 如果可能的话,我希望它是无锁的,因为它发生了 TON。不允许 Boost / C++ 11 :(
int val = memLoc[index++];
或者更好
int val = memLoc[index++ & 0xFF];
尝试从共享环形缓冲区进行线程安全读取,每次调用都会获得下一个值 - 如果可能的话,我希望它是无锁的,因为它发生了 TON。不允许 Boost / C++ 11 :(
这里唯一需要同步的操作是index
值的增量。由于这只是一个数值,因此可以通过原子增量在不使用锁的情况下完成。您列出的其余操作只是读取共享位置,不需要同步。
InterlockedIncrement
在 Win32 上,使用函数完成增量同步
int oldValue = InterlockedIncrement(&index);
int val = memLoc[oldValue & 0xFF];
Linux 上有各种可用的同步增量函数。关于这个stackoverflow线程上的选项有一个相当好的讨论
您需要在原子操作中增加和读回索引。不幸的是 ++ 运算符不保证任何原子性。
大多数处理器都有某种可以使用的 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。