InterlockedIncrement vs InterlockedIncrementAcquire vs Inter
InterlockedIncrement vs InterlockedIncrementAcquire vs InterlockedIncrementNoFence
有人能解释一下这三种原子操作的区别吗?
- InterlockedIncrement
- InterlockedIncrementAcquire
- InterlockedIncrementNoFence
我似乎找不到任何文档说明它们的意思,除了"uses acquire symantecs",我不理解。
谢谢。
离开文档,
InterlockedIncrement "为每个调用生成一个完整的内存屏障"。内存屏障是对CPU的特殊指令,它可以防止它像往常一样重新排序操作——例如,加载操作可能非常昂贵,所以给定一个看起来像"添加到a,添加到a,加载B,添加到B"的操作流,CPU将尝试将其重新排序为"加载B,添加到a,添加到a,添加到B",以便B的加载在需要之前有时间完成。
然而,这可能破坏并行程序中的逻辑,因此有时需要内存屏障。它们很昂贵:它们的成本往往和缓存丢失一样多。InterlockedIncrementAcquire尝试使用"获取语义",如果你的系统支持,如果不支持,它回落到InterlockedIncrement。从那篇博文开始,
Acquire语义防止read- Acquire在程序顺序中与它后面的任何读或写操作进行内存重排序
因此,获取语义是一种有限的、成本较低的内存屏障,仅在某些情况下有用(显然,当只涉及读时)。
最后,InterlockedIncrementNoFence不生成内存屏障——它是完全未检查的,并且它可能会导致顺序一致性问题。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- InterlockedIncrement vs InterlockedIncrementAcquire vs Inter