单处理器上的单写入器内存可见性保证
Single writer memory visibility guarantee on single processor
对于下面的C++代码
volatile bool keepRunning = true;
void run() {
while (keepRunning) {
doSomeWork();
}
}
void stop() {
keepRunning = false;
}
假设一个线程执行 stop(),多个线程执行 run()
我相信这种结构(一个编写器,没有同步原语)在嵌入式系统中非常普遍。假设没有多个处理器/内核,这是否保证有效?
谢谢
否,代码中不会施加内存屏障,因此编译器可以自由地使用非易失性访问重新排序易失性访问,这可能会导致不正确的行为。"易失性"与多线程关系不大,有关更多信息,请查看 Arch Robisoon 的博客文章。
如果这是单个 CPU 平台或多个 CPU 平台,这也无关紧要,如果代码正确,则存储发布将通过缓存一致性协议传播到其他 CPU/线程,一切都会很好。
是的,因为在单核机器上只有一个 CPU 和一个 CPU 缓存。
另一个原因:对于 CPU,看起来只有一个线程在运行。CPU 有义务向应用程序提供等效于单线程执行的内存视图,因为 CPU 甚至无法分辨出有多个线程。
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 放松的订单和线程间可见性
- GCC 6.x警告有关Lambda可见性
- C++ 中的Shared_ptr和内存可见性
- 静态库中的符号可见性和操作
- 从shm_open() mmap()更改对共享内存的可见性
- 单处理器上的单写入器内存可见性保证
- 内存模型排序和可见性