【发布时间】:2021-05-09 06:53:24
【问题描述】:
考虑两个线程,T1 和 T2,它们分别存储和加载原子整数 a_i。让我们进一步假设在加载开始执行之前执行存储。之前,我的意思是绝对意义上的时间。
T1 T2
// other_instructions here... // ...
a_i.store(7, memory_order_relaxed) // other instructions here
// other instructions here // ...
a_i.load(memory_order_relaxed)
// other instructions here
是否保证T2在加载后看到值7?
【问题讨论】:
-
线程“同步”是什么意思?是条件变量还是用于对操作进行排序的东西?
-
那你怎么知道哪个先发生?
-
“在执行时间线中一个接一个” - “执行时间线”是什么意思?在多线程方面没有通用的时间表。
-
在 C++ 中(在我们的物理宇宙中也没有)没有所谓的“绝对时间感”。 C++ 标准没有根据绝对时间来定义任何东西。
-
T2 保证可以看到曾经存储在
a_i中的值之一,包括 7。T2 永远不会看到未存储的值(如果a_i不是 @ 987654324@)。但是,如果周围的代码不保证a_i上的操作顺序,则无法保证它会看到哪个值。这种保证必须使用C++表达式之间的happens-before(线程内)和synchronizes-with(线程间)关系来建立,后者是通过获取和释放操作来实现的。所以你仍然需要在你的代码中somewhere获取/释放操作。
标签: c++ atomic cpu-architecture stdatomic