c++ - 我可以使以下代码无锁/原子锁吗?

标签 c++ multithreading atomic

int val = memLoc[index++];

或者更好

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

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

最佳答案

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

在 Win32 上同步增量是通过 InterlockedIncrement 函数完成的

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

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

关于c++ - 我可以使以下代码无锁/原子锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142765/

相关文章:

c++ - 如何从 TDirect2DCanvas (Direct2D Rendertarget) 复制数据?

c - 微 Controller 中的多线程

java - 当读取和设置简单引用已经是原子操作时,为什么要使用 AtomicRefernce

集合上的 C++ const

c++ - 如何将两个标签字段对作为一行添加到 QFormLayout?

c++ - 不确定如何装饰我的 C++ 库代码以在 C 中使用

multithreading - 如何并行执行自定义函数公式,同时保持Google表格的可共享性和非许可性?

c++ - 为什么C++线程/future开销这么大

java - 如何知道两个条件何时为真

c - C17 要我如何初始化我的原子?