这个内存屏障实现正确吗
Is this memory barrier implemented correctly?
我正在阅读一个遗留的C++代码,其中内存屏障定义如下。主要操作系统有linux和vxworks。编译器是gcc(WindRiver的gcc)。
#if((KCompilerGNU)||(kCompilerWindRiver))
#define MEMORY_BARRIER __asm__ volatile("nopn");
#else
#define MEMORY_BARRIER __asm nop;
#endif
但我不明白无操作是如何产生记忆屏障的?或者它只是一个故障实现?
这是编译器的障碍,而不是完整的硬件内存障碍。也就是说,它是一个不透明的调用,编译器无法对其进行优化,但它在内存重新排序方面对硬件没有任何影响。如果有问题的编译器确实将asm块视为不透明的,则可以正确地定义它(例如,gcc-asm块有特定的规则来定义块中可以更改的内容,等等)。
如果您知道此代码所针对的硬件具有从不重新排序内存操作的强大内存模型,则可以将其称为全内存屏障(通常会抑制编译器和硬件的重新排序)。
1也就是说,在程序是单线程的或机器没有表现出有趣的重新排序(例如,简单的顺序、非推测性CPU或单个CPU系统)的情况下,这样的障碍仍然是足够的。
相关文章:
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存的升压容器是否实现锁定?
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 使用连续内存实现多态性
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 在内存中连续分配的多维数组的实现
- 为什么 Valgrind 在此实现中报告内存泄漏?
- 实现快速排序的内存问题
- 为什么libstdc++的std::vector的ctor实现不会导致内存泄漏?
- 指针是如何在具有大量内存的超级计算机中实现的?
- CUDA:共享内存的超载以用多个数组实现还原方法
- 直观的内存布局,可实现快速SIMD/面向数据的设计
- 了解循环缓冲区实现的内存分配性质
- C 内存泄漏错误在实现堆栈类时
- 有可能实现一个与数组而不是单个对象一起工作的内存池吗
- 实现内存管理模板类时未解析的外部符号
- 在具有动态大小内存池的多线程C/C++中实现内存管理器