我可以使以下代码锁免费/原子吗?
Can I make the following code lock free / atomic?
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
如果您使用的是其他操作系统,则可能会有类似的功能。 但无论如何,您都需要操作系统或较低类型的访问权限才能获得原子获取增量存储。
相关文章:
- 是否可以使C++类成为Objc类的委托
- 是否可以使一个类成为两个不同层次结构的子类?
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- C 可以使destuructor不称为班级成员和基类攻击方的灾难
- 可以使未命名的结构静态
- 是否可以使整数仅收到一个单个数字而不是两个接收输入
- C++:有哪些常规方法可以使代码更有效地用于大数字
- 是否可以使 std 容器使用默认运算符为新?
- LD_BIND_NOW可以使可执行文件运行得更慢?
- 是否可以使头文件使文本居中?- 在控制台中
- 有什么方法可以使核心忙碌等待
- 有没有一种技术可以使虚函数在所有派生类中强制重写?
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 是否有一种方法可以使此C 14递归模板在C 17中短
- 编写一个可以使二维数组平坦的函数
- 有哪些优化技巧可以使我的代码运行得更快
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 如果必须在同一向量上写入线程,是否可以使用线程
- 对于具有两个模板化变量的模板化类,是否可以使一个 var 引用另一个 var
- 我可以使以下代码锁免费/原子吗?