首页 > 解决方案 > 多核共享变量可见性、内存模型和顺序一致性排序

问题描述

假设我们有 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 位架构。

我会很感激任何帮助,谢谢。

标签: cmultithreadingcachingcpu-cache

解决方案


推荐阅读