【发布时间】:2021-09-20 06:40:57
【问题描述】:
#include <atomic>
std::atomic<int> foo;
void ThreadA()
{
foo.store(1, std::memory_order_relaxed);
while (true) {};
}
void ThreadB()
{
while (foo.load(std::memory_order_relaxed) == 0)
{
}
}
对于使用relaxed 操作的原子变量,是否理论上 thread B 将永远无法读取foo 变量的最新值(假设没有干扰从其他线程刷新缓存)?
或者我们有什么保证,不管是硬件、操作系统还是C++标准,thread B可以在有限时间内读取到最新的foo变量值?
【问题讨论】:
-
嗯...我个人认为这是可能的。因为如果在加载指令和创建循环的跳转之后重新排序存储,则可能会出现问题。
-
@Afshin 如果
foo变量停留在CPU寄存器中,并且没有缓存刷新或同步操作,这种情况下thread B无法观察到foo变量的修改? -
松弛排序: "...标记为 memory_order_relaxed 的原子操作是不是同步操作;它们不会在并发内存之间强加顺序访问。它们只保证原子性和修改顺序的一致性...." en.cppreference.com/w/cpp/atomic/memory_order#Relaxed_ordering
-
"实现应该确保原子操作或同步操作分配的最后一个值(按修改顺序)将在有限的时间内对所有其他线程可见。"
标签: c++ multithreading caching atomic