Q1:我知道缓存一致性、存储缓冲区和失效队列是内存重新排序的根本原因?
存储释放是可以理解的,必须等待所有加载和存储完成后才能将标志设置为 true。
关于加载获取,原子加载的典型用法是等待标志。假设我们有 2 个线程:
int x = 0;
std::atomic<bool> ready_flag = false;
// thread-1
if(ready_flag.load(std::memory_order_relaxed))
{
// (1)
// load x here
}
// (2)
// load x here
// thread-2
x = 100;
ready_flag.store(true, std::memory_order_release);
编辑:在线程 1 中,它应该是一个 while 循环,但我从上面的文章中复制了逻辑。因此,假设内存重新排序是及时发生的。
Q2 : 因为 (1) 和 (2) 取决于 if 条件,CPU 必须等待 ready_flag,是否意味着 write-release 就足够了?在这种情况下如何进行内存重新排序?
Q3:显然我们有load-acquire,所以我猜 mem-reorder 是可能的,那么我们应该在哪里放置栅栏,(1)或(2)?