c - 多核共享变量可见性、内存模型和顺序一致性排序
问题描述
假设我们有 2 个线程在 2 个独立的 CPU 上并行运行。
有一个以原子方式写入和读取的标志和一个共享变量,两者都在两个线程上访问。
线程 1 只写入一次共享变量,然后自动设置公共标志,表示“一切都已初始化”。伪代码,类 C:
uint64 shared = some_value;
atomic_seq_cst_store(init_flag, 1);
...
线程 2 从不写入共享变量,但它会在原子读取公共标志并“看到”它被设置后读取它。伪代码:
while (atomic_seq_cst_load(init_flag) != 1) {}
uint64 local_value_of_shared = shared;
...
实际情况使用了更多的共享变量(仅从 init 线程写入一次)和一个单独的 init_flag。
有一个初始化线程在完成设置后将 init_flag 设置为 1,并且有更多工作线程遵循上面线程 2 的模式——它们等待 init_flag 可见,然后他们认为所有其他共享变量都有已初始化,并且它们的最新值在本地 CPU 缓存中可见。
是的,这是另一个缓存一致性问题:)
共享变量和标志永远不会超过 64 位变量。
我想知道这是否是现代多核 X86 和 ARMv8(及更高版本)CPU 上的安全模式。
编译器只有 gcc 和 64 位架构。
我会很感激任何帮助,谢谢。
解决方案
推荐阅读
- eclipse - 无法加载 p2 存储库
- html - 在 SWIFTUI 中显示 HTML 文本时检测到 AttributeGraph
- javascript - 有没有办法防止来自机器人的点击输入?
- postman - Postman + NTLM 身份验证 + 声明授权 + ASP.NET Core API = 403 Forbidden
- elasticsearch - ECK Filebeat Daemonset 转发到远程集群
- flutter - 如何创建这种类型的底部导航?
- javascript - 如何在返回的 pipe(map(...)) 语句中定义对象类型?
- python - Pyside6 在 QSqlRelationalTableModel 中插入一行
- flutter - 如何让 Flutter 应用使用某个网络证书?
- docker - 如何将'-search.maxUniqueTimeseriesi'标志传递给victoriametrics?