int val = memLoc[index++];
或更好
int val = memLoc[index++ & 0xFF];
尝试从共享环缓冲区执行线程安全读取,其中每个调用都获得下一个值 - 并且我希望它可以锁定,如果它发生了TON那么可能。没有允许Boost / C ++ 11 :(
答案 0 :(得分:7)
此处唯一需要同步的操作是index
值的增量。由于这只是一个数值,因此无需通过原子增量使用锁即可完成。您列出的其余操作只是读取共享位置而不需要同步。
在Win32上使增量同步是使用InterlockedIncrement
函数
int oldValue = InterlockedIncrement(&index);
int val = memLoc[oldValue & 0xFF];
Linux上有各种同步增量函数。关于这个stackoverflow线程的选项有一个相当好的讨论
答案 1 :(得分: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
如果你在另一个操作系统上,可能会有类似的功能。但无论如何,你需要操作系统或较低类型的访问来获得原子提取 - 增量存储。